我有一个gem,它只是为了便于实现而收集多个引擎,以及为所有包含的引擎提供一些实用方法。一种这样的实用方法是用于释放所有收集的引擎的新版本的rake任务。
我的问题是,当我运行应该在其中一个收集的引擎的上下文中执行的代码时(git命令,文件系统操作等),rake build
命令除外。出于某种原因,该命令以某种方式在伞形宝石的上下文中运行,并从其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.gem
的所需输出,但是当从伞形宝石中的rake任务运行时,我得到了collected_engine_a 3.12.9 built to pkg/collected_engine_a-3.12.2.gem
的令人费解的输出。似乎该版本是从伞形宝石的Gemfile.lock派生的(如果我在那里调整版本,它会影响输出)。
我在有bundle exec
前言的情况下都试过了,结果基本相同。
任何人都可以想到一种方法来获取正确的上下文,或者我是不是将它们从rakefile中移出来并进入标准脚本(重命名输出文件是一个不好的选择,不会被考虑) ?
答案 0 :(得分: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