3

実装を容易にするためにいくつかのエンジンを集め、含まれているすべてのエンジンにいくつかのユーティリティ メソッドを提供するためだけに存在する gem があります。そのようなユーティリティ メソッドの 1 つは、収集されたすべてのエンジンの新しいバージョンをリリースする rake タスクです。

私の問題は、収集されたエンジンのいずれかのコンテキストで実行する必要があるコードを実行すると、コマンドを除いてすべて (git コマンド、ファイル システム操作など) が機能することrake buildです。何らかの理由で、そのコマンドはアンブレラ gem のコンテキストで何らかの形で実行されており、Gemfile.lock からバージョン番号を取得しています。

例として次のコードを使用します。

Dir.chdir( PATH_TO_COLLECTED_ENGINE ) do
  # Below lie all of my failed build attempts, all of which failed in the same way...

  #p sh( 'bundle' ,  'exec' , 'rake' , 'build' )

  #p sh( 'bundle exec rake build' )

  #p `bundle exec rake build`

  #thr = Thread.new {
  #  p `bundle exec rake build`
  #}
  #thr.join

  #load File.join(Dir.pwd, 'Rakefile')
  #Rake::Task['build'].invoke

  #p `gem build #{ PATH_TO_COLLECTED_ENGINE_GEMSPEC_FILE }`
end

標準の Ruby ファイルから実行すると、目的collected_engine_a 3.12.9 built to pkg/collected_engine_a-3.12.9.gemcollected_engine_a 3.12.9 built to pkg/collected_engine_a-3.12.2.gem. アンブレラgemのGemfile.lockからバージョンを導出しているようです(そこでバージョンを調整すると出力に影響します)。

bundle exec基本的に同じ結果で、序文の有無にかかわらず両方を試しました。

誰かがこれを取得して正しいコンテキストを取得する方法を考えることができますか、またはこれらをrakefileから標準スクリプトに移動するのに行き詰まっています(出力ファイルの名前を変更することは考慮されない貧弱なオプションです)?

4

1 に答える 1

1

bundle execサブシェルで起動すると、特定の動作をします。に次の注記がありますbundle help exec

make sure that if bundler is invoked in the subshell, it uses the same Gemfile (by setting BUNDLE_GEMFILE)

したがって、あなたの場合、次のようにします。

bundle exec rake build BUNDLE_GEMFILE=#{PATH_TO_COLLECTED_ENGINE}/Gemfile

于 2013-05-24T20:34:56.237 に答える