如何在开发过程中将Bundler/Gemfile配置为使用不同的gem源?

Kyl*_*Fox 14 ruby gem rubygems bundler gemfile

我有一个Sinatra应用程序,需要我在本地开发的另一个gem.我在配置Bundler以在开发过程中使用我的本地gem代码时遇到了麻烦,但我在生产中使用了我的宝石代码.

理想情况下我可以这样做,但Bundler不允许你指定两次相同的gem:

# Doesn't work:
group :development do
  gem 'awesome', :path => "~/code/awesome"
end

group :production do
  gem 'awesome', :path => "vendor/gems/awesome-0.0.1"
end
Run Code Online (Sandbox Code Playgroud)

与此同时,我每次部署时都会手动出售gem并更新Gemfile中的gem源,这非常麻烦.我的工作流程如下:

  1. 在开发期间指向我的本地gem(gem 'awesome', :path => "~/code/awesome")
  2. 准备部署时,将gem解压缩 vendor/gems
  3. 更新Gemfile以指向vendored gem(gem 'awesome', :path => "vendor/gems/awesome-0.0.1")
  4. 运行bundle install(更新Gemfile.lock)
  5. 部署代码
  6. 返回第1步.

太麻烦了!我想做一些更简洁的事情,而不仅仅是编写Rake任务来自动化我当前的设置.

这种情况的最佳工作流程是什么?

小智 13

有一个新功能允许通过简单的specyfing local.gem_name配置选项,如:

bundle config local.rack ~/path/to/local/rack
Run Code Online (Sandbox Code Playgroud)

这仅在gem具有Gemfile中指定的git repo和branch时才有效.

有关更多详细信息,请参阅thrler文档:http://bundler.io/v1.3/bundle_config.html


小智 4

显然,您可以在 Gemfile 中使用常规 Ruby。根据这篇文章,您可以设置一个环境变量(或我发现的任何其他变量),让您选择要使用的 gem 版本。

## based on an ENV variable
if ENV['RACK_ENV'] == "development"
  gem 'awesome', :path => "~/code/awesome"
else
  gem 'awesome', :path => "vendor/gems/awesome-0.0.1"
end
Run Code Online (Sandbox Code Playgroud)

也许这会起作用。如果您需要供应正在进行的 gem,也许您可​​以制作一个小脚本来设置 ENV、供应它并重置 ENV。呃?