require File.expand_path(..., __FILE__)
はプロジェクト内の他のファイルを要求する最も良い方法ですか?File.expand_path(...、__FILE__)がベストプラクティスである必要がありますか?
答えて
Ruby 1.9.2 + require_relative
では、おそらくもっと正しい方法です。
require
は、セキュリティ上の理由から'.'
ディレクトリを含まないように変更されました。 require_relative
が追加され、呼び出しスクリプトのパスに関連するモジュール用のローカルファイル解決策が提供されました。
search here on StackOverflow、特に「What is require_relative in Ruby?」とインターネットでは、使用法を見つけることができます。why-for messagesは、その仕組みを説明しています。
また、「[Ruby:require vs require_relative - 両方のRubyで動作する回避策のベストプラクティス<1.9.2 and > = 1.9.2](http://stackoverflow.com/questions/4333286/ruby-require-vs-require-relative-best-practice-to-workaround-running-in -both)」はこれを説明する大きな糸です。 –
$LOAD_PATH
を変更しない限り、同じディレクトリ構造からの読み込みを続けるとよいでしょう。そうしないと、このようなことが起こります。
私はそれをやってに撮影した道、物事は、できるだけクロスプラットフォームとしてであることを確認するためには、このです:
require File.expand_path(File.join(*%w[ ... ]), File.dirname(__FILE__))
それは少し冗長だが、それは可能な最短パスとその結果ほとんどの場合、最小限の文法量が必要です。
より具体的な例は次のようになります。
require File.expand_path(File.join(*%w[ .. lib example ]), File.dirname(__FILE__))
あなたはたくさんのファイルを読み込む場合、物事を単純化するために$LOAD_PATH
に変更と組み合わせると、これを行うことができます。
$LOAD_PATH << File.expand_path(File.join(*%w[ .. lib ]), File.dirname(__FILE__))
require 'example'
コアにrequire_relative
がないRuby 1.8.xでは、File.expand_path(...,__FILE__)
は動作しません。
とします。__FILE__ == "/home/yourname/foo.rb"
とします。 File.expand_path("bar.rb",__FILE__)
は"/home/yourname/foo.rb/bar.rb
となります。何をしたい
はあなたにもbackports gemからrequire_relative
を得ることができる"/home/yourname/bar.rb"
を返しFile.expand_path("bar.rb",File.dirname(__FILE__))
です。
foo.rbのbaz.rbを同じディレクトリに含めるには、常に 'require File.expand_path(" ../ baz.rb "、__FILE __)'を実行することができます。 –
Mattのコメントに続いて、 'File.expand_path(" ../../lib/mygem.rb "、__FILE __)'は 'expand_path'の2.1.0文書で与えられた実際の例です。しかし、それはディレクトリ以外のディレクトリがディレクトリであると思われ、その想定された親に移動します!私は公式の文書がそのような逸脱したアプローチを推奨しているとうんざりしており、将来のバージョンで動作を変更する可能性のある実装の脆弱な副作用によってのみ機能するのだろうかと思います。私は 'dirname'のアプローチがもっときれいだと思います。 –
ルビー2.0ではKernel#__dir__
- 1. ルビーが対 './blahblah.rb' を必要とFile.expand_path( '../ blahblah'、__FILE__)を必要と
- 2. ブートストラップ:ベストプラクティス - コンテナにナビゲートする必要がありますか?
- 3. $ :. unshift(File.expand_path( "../../ lib"、__FILE__))は正確に何をしますか?
- 4. ベストプラクティス:双方向関係を回避する必要がありますか?
- 5. jqueryタブがdocument.ready内にある必要がありますか?
- 6. 私のIBackingStoreはスレッドセーフである必要がありますか?
- 7. OpenGLである必要がありますか?
- 8. PRNGはスレッドセーフである必要がありますか?
- 9. バックボーンモデルIDは数値である必要がありますか?
- 10. Struct.Error、Bytesオブジェクトである必要がありますか?
- 11. MongoCollection.forEachはスレッドセーフである必要がありますか?
- 12. メインアクティビティ名は.MainActivityである必要がありますか?
- 13. 移動コンストラクタはnoexceptである必要がありますか?
- 14. ユニバーサルリンクはルートドメインである必要がありますか?
- 15. statusCodeは200である必要がありますが、415
- 16. Xgboost plot_tree Error:ValueError:ブースターがブースターインスタンスである必要があります
- 17. typescriptをes6にコンパイルする必要がありますか?es5にコンパイルする必要があります
- 18. 大きなXMLファイルを解析する必要があります。ベストプラクティス?
- 19. Springのサンプルコードが必要です。aws S3がinBoundで、Apache kafkaがアウトバウンドである必要があります。
- 20. UIScrollviewはビュー上にある必要がありますか?
- 21. jsRender、データはJSONにある必要がありますか?
- 22. allow_url_openがある必要があります
- 23. ボタンが最下部にある必要があります
- 24. InvalidOperationException Nullableオブジェクトには値がある必要があります
- 25. 変数に制約エラーがある必要があります
- 26. JButtonがJPanel上にある必要があります。
- 27. アクションは普通のオブジェクトである必要があります。
- 28. プレイストアアンドロイドバージョンコードは高イオンアプリである必要があります
- 29. wpfスレッド、スレッドはSTAである必要があります
- 30. graphQL - タイプは出力タイプである必要があります
可能ならばこれを使うことができます。それは私が私がなしでできることを望むものです。 –
可能な複製http://stackoverflow.com/questions/224379/what-does-file-mean-in-ruby –
可能な複製[Ruby:必要な\ _relative - ベストプラクティスを両方のRubyで実行するには<1.9.2 and > = 1.9.2](http://stackoverflow.com/questions/4333286/ruby-require-vs-require-relative-best-practice-to-workaround-running-in-both) –