1

ファイルシステム上の場所を含む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が実際にそこになくても、常にインストールディレクトリからの相対パスを返すため、開発環境では役に立ちません。

4

1 に答える 1

1

提供されているバックトレース機能をいつでも利用できます。

caller.first

ファイルと行のアマルガムを生成しますが、通常は。で区切られ:ます。行情報を無視して残りを保持することにより、何らかの理由でコロンを含む可能性のあるファイル名またはパスを許可するように注意します。言い換えれば、しないでsplitくださいsub

caller.first.sub(/:\d+:in .*$/, '')
于 2012-06-07T03:15:43.757 に答える