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

Posted

技术标签:

【中文标题】在开发过程中如何配置 Bundler/Gemfile 以使用不同的 gem 源?【英文标题】:How can Bundler/Gemfile be configured to use different gem sources during development? 【发布时间】:2011-11-12 08:37:30 【问题描述】:

我有一个 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 源,这很麻烦。我的工作流程是这样的:

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

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

这种场景的最佳工作流程是什么?

【问题讨论】:

【参考方案1】:

如果您使用 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']

【讨论】:

【参考方案2】:

显然,您可以在 Gemfile 中使用常规 Ruby。根据this article,您可以设置一个环境变量(或我发现的任何其他变量),让您选择要使用的 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。嗯?

【讨论】:

我尝试了本文之前建议的方法,大部分都可以。问题是,当我部署时, Gemfile.lock 指的是我的本地 gem(参见他的最后两个代码示例)。我想我可以在本地安装生产 gems 然后部署,或者从 git 中完全排除 Gemfile.lock ......但我不确定这些选项中的任何一个都是最好的方法。 是的,我想完成同样的事情,但似乎没有干净的方法可以做到这一点。【参考方案3】:

有一个新功能可以做到这一点,只需指定 local.gem_name 配置选项,例如:

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

这仅适用于 gem 具有在 Gemfile 中指定的 git repo 和分支的情况。

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

【讨论】:

【参考方案4】:

这是一个我没有充分发挥作用的建议(用于狂欢主题,我在主题的一些样式表上遇到了问题):

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

【讨论】:

这行不通。 Bundler 给你一个错误,说你不能拥有来自不同来源的两个 gem 你不能在 gemfile 中两次提到一个 gem

以上是关于在开发过程中如何配置 Bundler/Gemfile 以使用不同的 gem 源?的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins管道脚本的开发过程应该如何?

在开发过程中管理多个应用配置文件

长期更新Web后端开发过程中的各种错误和问题总结

在货物监控设备的开发使用中,如何进行参数配置?

javaee开发工具及环境配置过程

如何配置switchhosts