Ruby 如何配置Bundler/Gemfile以在开发期间使用不同的gem源?
我有一个Sinatra应用程序,需要另一个我正在本地开发的gem。我在配置Bundler以在开发过程中使用我的本地gem代码时遇到问题,但在生产过程中使用了我的供应商gem代码 理想情况下,我可以这样做,但Bundler不允许您两次指定同一个gem:Ruby 如何配置Bundler/Gemfile以在开发期间使用不同的gem源?,ruby,rubygems,gem,bundler,gemfile,Ruby,Rubygems,Gem,Bundler,Gemfile,我有一个Sinatra应用程序,需要另一个我正在本地开发的gem。我在配置Bundler以在开发过程中使用我的本地gem代码时遇到问题,但在生产过程中使用了我的供应商gem代码 理想情况下,我可以这样做,但Bundler不允许您两次指定同一个gem: # Doesn't work: group :development do gem 'awesome', :path => "~/code/awesome" end group :production do gem 'awesome
# 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&每次部署时都更新gem文件中的gem源代码,这相当麻烦。我的工作流程如下:
gem'awesome',:path=>“~/code/awesome”
)vendor/gems
gem'awesome',:path=>“vendor/gems/awesome-0.0.1”
)这个场景的最佳工作流是什么?显然,您可以在文件中使用常规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。呃?有一个新功能允许这样做,只需指定
local.gem\u name
config选项,例如:
bundle config local.rack ~/path/to/local/rack
只有当gem文件中指定了git repo和分支时,这才有效
有关更多详细信息,请参阅thr Bundler文档:这里有一个建议,我没有充分发挥作用(用于spree主题,我在该主题的一些样式表中遇到了问题):
复制gemname.gempec文件并将其命名为gemnamedev.gempec,并将其中的s.name更改为“gemnamedev”。如果您使用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"]
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']
我尝试了这篇文章早些时候的建议,大部分情况下都没问题。问题是,当我部署时,Gemfile.lock引用了我的本地gem(参见他最后的两个代码示例)。我想我可以在本地安装生产gems&然后部署,或者完全从git中排除Gemfile.lock。。。但我不确定这两个选项是否是最好的方法。是的,我想完成同样的事情,但似乎没有干净的方法来做到这一点。这是行不通的。Bundler会给你一个错误,告诉你不能有两个来自不同来源的gem,你不能在gem文件中两次提到一个gem
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']