我有一个 gem,它的存在只是为了将多个引擎收集在一起以便于实施,并为所有包含的引擎提供一些实用方法。一种这样的实用方法是发布所有收集的引擎的新版本的 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.gem
的collected_engine_a 3.12.9 built to pkg/collected_engine_a-3.12.2.gem
. 似乎该版本是从伞形 gem 的 Gemfile.lock 派生的(如果我在那里调整版本,它会影响输出)。
有前言和无序言我都试过了bundle exec
,结果基本一样。
任何人都可以想出一种方法来获取正确的上下文,或者我是否坚持将它们从 rakefile 中移出并放入标准脚本中(重命名输出文件是一个糟糕的选择,不会被考虑)?