2011-02-21 16 views
3

RSpecの一部として、私は宝石に含まれるファイルを参照する必要があります(gem fooと呼んでいます)。私はgem fooを制御するので、必要に応じて変更することができます。宝石のベース/ホームディレクトリ

gem 'foo'には、rspec仕様で参照する必要のあるファイルが含まれています。 'foo'のベースディレクトリを把握するためのRubyGem APIまたはBundler APIが適度に安定していますか? 'foo' を仮定し

は、すでに私のGemfileに必要とされています。Gemfileで

gem 'foo' 

私は(something_spec.rbで)このような何かをしたい:

filename = File.expand_path('examples/xml/result.xml', Gem.gem_base_path('foo')) 

gem_base_path APIコールとは何ですか?

答えて

2

私はこれを行うには、あなたの宝石で関数を作成することはお勧めします:

module Foo 
    class Configuration 
    def self.result_xml_path 
     File.realpath("../examples/xml/result.xml") 
    end 
    end 
end 

あなたは、あなたの仕様で次の手順を実行することができます

filename = Foo::Configuration.result_xml_path 

すべて取得しているので、これははるかに安全です宝石からの情報それはまたきれいに見えます。

+0

私はターゲットのGemにメソッドを追加するのが好きです。疑わしいFile.realpathは 'File.expand_path(" ../examples/xml/ result.xml "、__FILE __)'でなければなりません。ターゲットの宝石を変更せずにこれを行う方法はありますか? –

+0

あなたの質問が分かりません。あなたは明確にしていただけますか? File.realpath "シンボリックリンクや無駄なドットを含んでいない実際のファイルシステムのパス名の実際の(絶対)パス名を返します"ので、相対パスを気にせずに使用できるはずです。 –

+0

'File#realpath'のように2つの引数をとります.2番目の引数を指定しないと、現在の作業ディレクトリに対する結果が返されます。実行するファイルが格納されているディレクトリに対する相対パスを返すことです。 –

0

これは'foo'宝石に触れるアリなくても、あなたが必要とするものを行うことがあります。

matches = Gem::Specification.find_all_by_name 'foo' 
spec = matches.first 
filename = File.expand_path('examples/xml/result.xml', spec.full_gem_path) 

私はあなたがすなわち私のスペックでで定義されたいくつかの工場をロードする(必要なものと同様のものを作るために、このコードを使用しています私のプロジェクトで使用されている宝石)