Gemfile 中的 Ruby Bundler 多个源
Posted
技术标签:
【中文标题】Gemfile 中的 Ruby Bundler 多个源【英文标题】:Ruby Bundler multiple sources in Gemfile 【发布时间】:2013-04-10 22:41:49 【问题描述】:我需要确保我的一些 gem 是从我们自己的 gem 存储库而不是 rubygems 安装的,而其余的则是从 rubygems 安装的。我可以在 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 推送到 rubygems,但如果它是唯一的,这不太可能。
【讨论】:
我喜欢这个解决方案,因为它允许生产从 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 后以部署模式安装