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

时间:2011-09-07 17:07:26

标签: ruby rubygems gem bundler gemfile

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

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

# 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

与此同时,我采取了手动销售宝石和放大器的方法。我每次部署时都会更新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步。
  7. 真麻烦!我想做一些更简洁的事情,而不仅仅是编写Rake任务来自动化我当前的设置。

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

4 个答案:

答案 0 :(得分:13)

有一项新功能可以通过简单地指定local.gem_name配置选项来实现,例如:

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

仅当gem在Gemfile中指定了git repo和branch时才有效。

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

答案 1 :(得分:3)

显然,您可以在Gemfile中使用常规Ruby。根据{{​​3}},你可以设置一个环境变量(或我发现的任何其他变量),让你选择你想要使用的宝石版本。

## 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

也许那会奏效。如果您需要提供正在进行中的宝石,也许您可​​以创建一个小小的脚本,它将设置ENV,供应它,并重置ENV。是吗?

答案 2 :(得分:0)

如果你使用 docker 来构建你的容器,你总是可以在 dockerfile 中将路径设置为环境变量,并在 Gemfile 中使用这个环境变量。请在下面找到 Dockerfile 和 Gemfile 的示例。

Dockerfile

ARG tenant
ENV mgm=3
ENV GEMBOX_URL='abc.com:9292'
WORKDIR /app
COPY Gemfile* ./
RUN bundle install --without development test
COPY . .
ENTRYPOINT ["entrypoint.sh"]
CMD ["crond", "-f"]

宝石文件

source 'https://rubygems.org/'
source ENV['GEMBOX_URL']
gem 'jwt'
gem 'activerecord-import'
gem 'wicked_pdf' 
gem 'wkhtmltopdf-binary-edge', '~> 0.12.5.0'
gem 'zgear', '~> 0.6.4.1', source: ENV['GEMBOX_URL']
gem "piston", '~> 1.3.1', source: ENV['GEMBOX_URL']
gem 'communication_connector', '~> 0.1.4', source: ENV['GEMBOX_URL']
gem 'health_check', source: ENV['GEMBOX_URL']

答案 3 :(得分:-3)

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

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”。