我有一个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源代码,这非常麻烦。我的工作流程如下:
- 在开发过程中指向我的本地宝石(
gem 'awesome', :path => "~/code/awesome"
) - 当准备好部署时,将gem解包到
vendor/gems
- 更新Gemfile指向供应商gem (
gem 'awesome', :path => "vendor/gems/awesome-0.0.1"
) - 运行
bundle install
(更新Gemfile.lock) - 部署代码
- 返回步骤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。