web-dev-qa-db-ja.com

require File.expand_path(...、__FILE__)がベストプラクティスですか?

require File.expand_path(..., __FILE__)は、プロジェクト内の他のファイルを要求する最良の方法ですか?

49
dan

Ruby 1.9.2 + require_relativeの方がおそらく正しい方法です。

requireが変更され、'.'セキュリティ上の理由からディレクトリ。 require_relativeは、呼び出しスクリプトのパスに関連するモジュールのローカルファイルソリューションを提供するために追加されました。

ここでStackOverflow 、特に「 What is require_relative in Ruby? 」を検索して、インターネットや使用法のトリックや why-for messages それがどうやって起こったかを説明します。

37
the Tin Man

Ruby 2.xでは Kernel#__dir__

7
Steve Benner

$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'
3
tadman

Ruby 1.8.xでは、コアに_require_relative_がない場合、File.expand_path(...,__FILE__)は機能しません。

___FILE__ == "/home/yourname/foo.rb"_とします。 File.expand_path("bar.rb",__FILE__)は_"/home/yourname/foo.rb/bar.rb_を返します。

あなたが欲しいのは_"/home/yourname/bar.rb"_を返すFile.expand_path("bar.rb",File.dirname(__FILE__))です

backports gem から_require_relative_を取得することもできます。

2
Ken Bloom