ファイルシステム上の場所を含むgemメタデータへのアクセスを提供するライブラリを開発しています。アイデアは、gem の作成者が任意のスクリプトからの相対パスに設定できるようにすることでした:
# $root/example.gemspec
Example::Gem.root '.' # => $root/
# $root/lib/example/gem.rb
Example::Gem.root '../..' # => $root/
次に、現在のスクリプトのパスを使用して絶対パスを計算します。私の実装は現在次のとおりです。
def root(relative_to = nil, file = __FILE__)
unless relative_to.nil?
@root = File.expand_path relative_to, File.dirname(file)
end
@root
end
呼び出し元のスクリプトへのパスを返すと思っ__FILE__
ていましたが、その仮定は間違っています。
それはライブラリ自体の中で機能しましたが、他の宝石の 1 つと統合しようとしたときに機能しなくなりました。生成されたパスは、常にサポート ライブラリ自体に対して相対的でした。
__FILE__
すべての呼び出しで電流を渡さなくても、これを実装するにはどうすればよいですか? そうでなければ、得られる価値はあまりありません。書くことroot('../..', __FILE__)
は、同じことをする実際のメソッドを書くこととほとんど同じです。
何も指定しなくてもパスがわかればもっといいのですが、思いつきませんでした。Railsはどのようにそれを行いますか?
ちなみに、私は知っGem::Specification#gem_dir
ていますが、gemが実際にそこになくても、常にインストールディレクトリからの相対パスを返すため、開発環境では役に立ちません。