Bundler / Gemfile如何配置为在开发期间使用不同的gem源?

我有一个Sinatra应用程序需要另一个我在本地开发的gem。 我在配置Bundler以在开发过程中使用我的本地gem代码时遇到了麻烦,但我在生产中使用了我的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 

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

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

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

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

有一个新function允许通过简单地指定local.gem_name配置选项来执行此操作,如:

 bundle config local.rack ~/path/to/local/rack 

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

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

显然,您可以在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 

也许那会奏效。 如果你需要提供你正在进行的gem,也许你可以制作一个小小的脚本,它将设置ENV,供应它,并重置ENV。 嗯?

这是一个我没有完全工作的建议(用于狂欢主题,我从主题的一些样式表遇到问题):

 group :production do gem 'gemname', '~> 0.1.6', :git => 'git://github.com/foouser/gemname.git' end group :development do gem 'gemnamedev', :path => '~/path/gemname' # use local version end 

复制gemname.gemspec文件并将其命名为gemnamedev.gemspec,并将其中的s.name更改为“gemnamedev”。