私がしたい場合はベストプラクティスであるrequire
Rubyで相対ファイルと私はそれが両方は1.8.xおよび> = 1.9.2で動作するようにしたいですか?
いくつかのオプションが表示されます:
- ただやれば
$LOAD_PATH << '.'
、すべてを忘れる - 行う
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
RUBY_VERSION
1.9.2未満かどうかを確認し、require_relative
として定義しrequire
、require_relative
後で必要な場所すべてで使用するrequire_relative
すでに存在するかどうかを確認し、存在する場合は、前のケースと同様に続行してください。- 次のような奇妙な構造を使用してください-残念ながら、Ruby 1.9では完全に機能していないようです。
require File.join(File.dirname(__FILE__), 'path/to/file')
$ cat caller.rb require File.join(File.dirname(__FILE__), 'path/to/file') $ cat path/to/file.rb puts 'Some testing' $ ruby caller Some testing $ pwd /tmp $ ruby /tmp/caller Some testing $ ruby tmp/caller tmp/caller.rb:1:in 'require': no such file to load -- tmp/path/to/file (LoadError) from tmp/caller.rb:1:in '<main>'
- 奇妙な構造でさえも機能するようですが、奇妙で見栄えもよくありません。
require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
- バックポートの gemを使用します。これはかなり重いです。rubygemsインフラストラクチャが必要で、他の回避策がたくさん含まれてい
require
ますが、相対ファイルで作業したいだけです。
ありますStackOverflowのに密接に関連する質問いくつかのより多くの例を示しますが、それは明確な答え与えていない-ベストプラクティスです。
Ruby <1.9.2と> = 1.9.2の両方でアプリケーションを実行できるようにするための、誰でも受け入れられる汎用的な解決策はありますか?
更新
明確化:「Xを実行できます」のような答えだけが欲しいのではありません。実際、問題の選択肢のほとんどについてはすでに述べました。私が欲しいの理論的根拠、つまり、なぜそれが最善の方法である、その長所と短所は何であり、なぜそれが他の人の中から選択する必要がありますが。
a.rb
し、インタープリターb.rb
に現在のディレクトリ(通常はと同じディレクトリa.rb
)のファイルの内容を読み取って解析させたい場合は、単に書き込むだけでrequire 'b'
、デフォルトの検索パスに現在のディレクトリが含まれているので問題ありません。最新のRuby 1.9では、標準のライブラリパスで検索するrequire_relative 'b'
場合と同様に、この場合は記述する必要がありrequire 'b'
ます。これは、適切にインストールされない単純なスクリプト(たとえば、インストールスクリプト自体)の前方互換性と後方互換性を損なうものです。
backports
だけのためにrequire_relative
、私の答えを参照してください...
require
との違いは何require_relative
ですか?