5

実行可能な foo.rb があり、ライブラリ bar.rb が次のように配置されているとします。

<root>/bin/foo.rb
<root>/lib/bar.rb

foo.rb のヘッダーに、bar.rb に機能を組み込むために次の require を配置します。

require File.dirname(__FILE__)+"../lib/bar.rb"

foo.rb へのすべての呼び出しが直接である限り、これは正常に機能します。たとえば、$HOME/project と foo.rb のシンボリック リンクを に配置すると$HOME/usr/bin、 に__FILE__解決されるため、 のディレクトリ名に関連し$HOME/usr/bin/foo.rbて見つけることができません。bar.rbfoo.rb

rubygems などのパッケージング システムは、ライブラリを検索する名前空間を作成することでこれを修正することを認識してい$:ます$HOME/project/lib。この問題の経験があり、有用な解決策やレシピを見つけた人はいますか?

4

3 に答える 3

12

私はこれがかなり古いことを知っていますが、私はこれを見つけました:

require 'pathname'
APP_ROOT = File.join(File.dirname(Pathname.new(__FILE__).realpath),'..')
于 2009-04-20T20:07:44.307 に答える
2

この関数を使用して、任意のシンボリックリンクをたどり、実際のファイルのフルパスを返すことができます。

def follow_link(file)
  file = File.expand_path(file)

  while File.symlink?(file)
    file = File.expand_path(File.readlink(file), File.dirname(file))
  end

  file
end

puts follow_link(__FILE__)
于 2008-11-27T10:50:38.490 に答える
1

+オブジェクトでうまく機能し、メソッドPathnameもあることに言及する価値があるKernel.Pathnameので、@ Burkeの元のコードはさらに短くすることができます:

require 'pathname'
APP_ROOT = Pathname.new(__FILE__).realpath + "../../lib"
于 2010-04-20T09:37:54.097 に答える