在开发过程中如何配置 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 源?的主要内容,如果未能解决你的问题,请参考以下文章