我编写了一个gem elastic-beanstalk,它将在rails项目文件结构中使用,也可以在独立的CI环境中使用,其中rails目录和文件不可用(没有解压缩等)。即运行eb:package
的Bamboo构建过程将产生一个主要工件app.zip
,其中部署计划稍后可能在另一个代理上可以接管并执行eb:deploy
。
在rails项目结构中,这一切都运行正常,因此我的目标是让它在独立的CI环境中运行。
一个空目录(CI环境),只创建了app.zip
,eb.yml
,binstubs,并且可以使用gem
我运行elastic-beanstalk eb:deploy
它应使用此gem的依赖项和lib文件运行等效的rake eb:deploy
。
看来bin存根可能就是我正在寻找的东西。探索another SO post,我已经尝试过(到目前为止无效)bin/elastic-beanstalk
:
gem_dir = File.expand_path('..',File.dirname(__FILE__))
$LOAD_PATH.unshift gem_dir# Look in gem directory for resources first.
lib = File.expand_path('lib', gem_dir)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'elastic/beanstalk'
require 'rake'
require 'pp'
pwd=Dir.pwd
Dir.chdir("#{gem_dir}/bin") # We'll load rakefile from the gem's bin dir.
Rake.application.init
Rake.application.load_rakefile
Dir.chdir(pwd) # Revert to original pwd for any path args passed to task.
Rake.application.invoke_task(ARGV[0])
所以这样运行,但仍然因为undefined method 'safe_load_file' for Psych:Module (NoMethodError)
开始的相同依赖性问题而失败。虽然我认为binstub是要走的路:
答案 0 :(得分:3)
最终,我需要调用Bundler.setup
来解决依赖关系。
清理之后,下面的文件是我需要在gem中使用bin文件调用rake任务的唯一方法(外部bin存根使用此文件):
#!/usr/bin/env ruby
require 'rake'
require 'bundler'
raise "Bundler is required. Please install bundler with 'gem install bundler'" unless defined?(Bundler)
#
# Example:
#
# elastic-beanstalk eb:show_config
# elastic-beanstalk eb:show_config[1.1.1]
#
# init dependencies
Bundler.setup
# init rake
Rake.application.init
# load the rake tasks
gem_dir = File.expand_path('..',File.dirname(__FILE__))
load "#{gem_dir}/lib/elastic/beanstalk/tasks/eb.rake"
# invoke the given task
Rake.application.invoke_task(ARGV[0])