154

.Ruby 1.9.2の最新のチェンジセットでは、現在のディレクトリがの一部になりませんLOAD_PATH.私はそれがの一部であると想定する重要な数のRakefileを持っているLOAD_PATHので、これはそれらを壊しました(プロジェクトパスに基づくすべてのrequireステートメントに対して「ロードするそのようなファイルはありません」と報告しました)。これを行うための特別な理由はありましたか?

修正に関しては、$: << "."どこにでも追加することはできますが、信じられないほどハッキーなようで、私はそれをしたくありません。Rakefiles 1.9.2+と互換性を持たせるための好ましい方法は何ですか?

4

7 に答える 7

141

これは「セキュリティ」リスクと見なされていました。

絶対パスを使用して回避できます

File.expand_path(__FILE__) et al

またはやって

require './filename' (ironically).

またはを使用して

require_relative 'filename'

または「include」ディレクトリを追加する

ruby -I . ...

または同じ、irbを使用します。

$irb -I .
于 2010-05-24T21:44:30.300 に答える
34

2つの理由があります:

  • 堅牢性と
  • 安全

どちらも基本的な原則に基づいています。一般に、コードを実行すると、現在のディレクトリが何であるかを知ることはできません。つまり、ファイルが必要で、現在のディレクトリにあることに依存している場合、そのファイルがそこにあるかどうか、または実際にそこにあると予想されるファイルであるかどうかを制御する方法はありません。

于 2010-05-25T07:17:53.543 に答える
16

他の回答が指摘しているよう.に、ロードパスでは、ロードDir.pwdされている現在のファイルのディレクトリではなく、現在の作業ディレクトリが参照されるため、セキュリティ上のリスクがあります。したがって、スクリプトを実行している人は誰でもcd、別のディレクトリに移動するだけでこれを変更できます。良くない!

代わりに、から構築されたフルパスを使用しています__FILE__

require File.expand_path(File.join(File.dirname(__FILE__), 'filename'))

とは異なりrequire_relative、これはRuby1.8.7との下位互換性があります。

于 2011-03-18T06:50:08.517 に答える
8

使用するrequire_relative 'file_to_require'

これをコードにスローして、1.8.7でrequire_relativeを機能させます。

unless Kernel.respond_to?(:require_relative)
  module Kernel
    def require_relative(path)
      require File.join(File.dirname(caller.first), path.to_str)
    end
  end
end
于 2013-01-25T13:50:35.877 に答える
6

'。' あなたの道のりは、Unixの世界では長い間悪いことだと考えられてきました(たとえば、http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.htmlを参照)。Rubyの人々はそうしないという知恵に説得されてきたと思います。

于 2010-05-25T07:32:48.623 に答える
3

JörgWMittagが指摘したように、使用したいのはrequire_relative、必要なファイルがrequire現在の作業ディレクトリではなく、宣言のソースファイルに関連していることだと思います。

依存関係は、rakeビルドファイルに関連している必要があります。

于 2011-02-01T11:15:35.657 に答える
3

いくつかのことに気付くまで、これは混乱を招く変化であることがわかりました。

.profile(Unix)でRUBYLIBを設定し、以前と同じように生活を続けることができます。

export RUBYLIB="."

しかし、前述のように、そうすることは長い間安全でないと考えられてきました。

ほとんどの場合、先頭に「。」を付けてRubyスクリプトを呼び出すだけで、問題を回避できます。例:./ scripts/server。

于 2011-04-01T21:45:47.483 に答える