bin stub - 缺少gem的依赖项(在gem中执行rake任务)

时间:2013-08-20 16:55:46

标签: gem rake rakefile

我编写了一个gem elastic-beanstalk,它将在rails项目文件结构中使用,也可以在独立的CI环境中使用,其中rails目录和文件不可用(没有解压缩等)。即运行eb:package的Bamboo构建过程将产生一个主要工件app.zip,其中部署计划稍后可能在另一个代理上可以接管并执行eb:deploy

目标

在rails项目结构中,这一切都运行正常,因此我的目标是让它在独立的CI环境中运行。

鉴于

一个空目录(CI环境),只创建了app.zipeb.yml,binstubs,并且可以使用gem

我运行elastic-beanstalk eb:deploy

然后

它应使用此gem的依赖项和lib文件运行等效的rake eb:deploy

更新 - Bin Stub

看来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是要走的路:

如何解决bin存根的依赖性问题?

1 个答案:

答案 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])