2010-12-01 30 views
48

require File.expand_path(..., __FILE__)はプロジェクト内の他のファイルを要求する最も良い方法ですか?File.expand_path(...、__FILE__)がベストプラクティスである必要がありますか?

+0

可能ならばこれを使うことができます。それは私が私がなしでできることを望むものです。 –

+0

可能な複製http://stackoverflow.com/questions/224379/what-does-file-mean-in-ruby –

+0

可能な複製[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) –

答えて

35

Ruby 1.9.2 + require_relativeでは、おそらくもっと正しい方法です。

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

search here on StackOverflow、特に「What is require_relative in Ruby?」とインターネットでは、使用法を見つけることができます。why-for messagesは、その仕組みを説明しています。

+2

また、「[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)」はこれを説明する大きな糸です。 –

3

$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' 
2

コアに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__))です。

+0

foo.rbのbaz.rbを同じディレクトリに含めるには、常に 'require File.expand_path(" ../ baz.rb "、__FILE __)'を実行することができます。 –

+0

Mattのコメントに続いて、 'File.expand_path(" ../../lib/mygem.rb "、__FILE __)'は 'expand_path'の2.1.0文書で与えられた実際の例です。しかし、それはディレクトリ以外のディレクトリがディレクトリであると思われ、その想定された親に移動します!私は公式の文書がそのような逸脱したアプローチを推奨しているとうんざりしており、将来のバージョンで動作を変更する可能性のある実装の脆弱な副作用によってのみ機能するのだろうかと思います。私は 'dirname'のアプローチがもっときれいだと思います。 –

6

ルビー2.0ではKernel#__dir__

関連する問題