2

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

目标

在 Rails 项目结构中,这一切都运行良好,所以我的目标是在独立 CI 环境中也能运行。

给定

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

什么时候

我跑elastic-beanstalk eb:deploy

然后

它应该运行相当于rake eb:deploy使用此 gem 的依赖项和 lib 文件。

更新 - Bin Stub

看来 bin 存根可能是我正在寻找的东西。探索另一个 SO 帖子,我尝试过(到目前为止无济于事)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 存根的依赖问题?

4

1 回答 1

3

最终,我需要调用Bundler.setup来解决依赖关系。

清理后,下面的文件是我唯一需要使用 gem 中的 bin 文件调用 rake 任务(外部 bin 存根使用此文件):

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])
于 2013-08-21T15:44:48.987 回答