Gemfile 中的 Ruby Bundler 多个源

Posted

技术标签:

【中文标题】Gemfile 中的 Ruby Bundler 多个源【英文标题】:Ruby Bundler multiple sources in Gemfile 【发布时间】:2013-04-10 22:41:49 【问题描述】:

我需要确保我的一些 gem 是从我们自己的 gem 存储库而不是 ruby​​gems 安装的,而其余的则是从 ruby​​gems 安装的。我可以在 Gemfile 中设置它而不用担心与 Rubygems 中同名 gem 的命名冲突吗?如何确定 gem 是从哪里下载的?

例如 宝石文件:

source :rubygems  
gem 'gemfromrubygems1'  
gem 'gemfromrubygems2'

source "http://our.own.gem.repo.com/the/path/to/it"  
gem 'gemfromourrepo'

【问题讨论】:

【参考方案1】:

Bundler 1.7 有一个新功能,允许您通过将特定宝石嵌套在一个块中来选择它们的来源:

source "https://rubygems.org"

gem 'gemfromrubygems1' 
gem 'gemfromrubygems2'

source "http://our.own.gem.repo.com/the/path/to/it" do
  gem 'gemfromourrepo'
end

或将其指定为选项:

source "https://rubygems.org"

gem 'gemfromrubygems1' 
gem 'gemfromrubygems2'

gem 'gemfromourrepo', source: "http://our.own.gem.repo.com/the/path/to/it"

详情请见http://bundler.io/v1.7/gemfile.html

【讨论】:

【参考方案2】:

根据Gemfile manpage 中的源优先级部分,从最后输入到第一次搜索源。

根据您所说,听起来您希望始终更喜欢您的宝石而不是 rubygems.org。只要您不需要改变您的偏好(即来自rubygems.org 的一些副本和来自您的私人仓库的一些副本),那么您的问题只需使用以下Gemfile 即可解决:

source 'https://rubygems.org'
source 'http://our.own.gem.repo.com/the/path/to/it'

gem 'gemfromrubygems1'  
gem 'gemfromrubygems2'
gem 'gemfromourrepo'

【讨论】:

【参考方案3】:

我发现的唯一方法似乎是一个可怕的 hack。

Bundler 将从最后列出的源开始搜索您的 gem 的最佳版本,然后搜索之前列出的所有源。源代码行相对于 gem 行的位置无关紧要,只是相对于彼此。

我尝试使用 :git 和 :path 使其工作,但这些都不适用于 gemservers。剩下的就是匹配最好的版本。

如果您将 gem 的版本设置为类似 2.mine.1 并将其推送到您的服务器,您可以在 Gemfile 中限制版本。

source :rubygems
source 'http://myrepo'    
gem 'gemfromourrepo', '~> 2.ourrepo'

那么最佳匹配版本应该是来自您的服务器的版本。有人可以将他们自己的与 2.ourrepo.2 同名的 gem 推送到 ruby​​gems,但如果它是唯一的,这不太可能。

【讨论】:

我喜欢这个解决方案,因为它允许生产从 gem 的生产版本中提取,而在开发中我可以从 gem 的开发版本中提取。【参考方案4】:

路径命令可能会有所帮助。它允许您设置 gem 特定的来源

gem "foo", "1.0", :path => "bar"

来源:http://bundler.io/v1.3/man/gemfile.5.html

【讨论】:

以上是关于Gemfile 中的 Ruby Bundler 多个源的主要内容,如果未能解决你的问题,请参考以下文章

您想告诉我为啥即使我将 bundler 更新为“2.2.21”,Gemfile.lock 中的 bundler 版本仍然是“2.2.16”吗?

Bundler:您尝试在更改 Gemfile 后以部署模式安装

Rails bundler 不会在组内安装 gem

Bundler:始终在 Gemfile 中使用最新版本的 git 分支

使用bundler时如何在Gemfile中使用gem?

html Jekyll Casts - Gems,Gemfile和Bundler