如何配置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

在此期间,我已经诉诸于手动出售宝石& &;每次部署时都要在Gemfile中更新gem源代码,这非常麻烦。我的工作流程如下:

  1. 在开发过程中指向我的本地宝石(gem 'awesome', :path => "~/code/awesome")
  2. 当准备好部署时,将gem解包到vendor/gems
  3. 更新Gemfile指向供应商gem (gem 'awesome', :path => "vendor/gems/awesome-0.0.1")
  4. 运行bundle install(更新Gemfile.lock)
  5. 部署代码
  6. 返回步骤1

真麻烦!我想做一些更干净的事情,而不是简单地编写Rake任务来自动化我当前的设置。

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

有一个新功能允许这样做,只需指定local.gem_name配置选项,如:

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

只有当gem在Gemfile中指定了git的repo和分支时才会起作用。

查看Bundler文档获取更多详细信息: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。是吗?

如果你使用dockerker来构建容器,你可以在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"]

Gemfile

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']

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

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。并将其命名为gemnamedev。

最新更新