30

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

例如 Gemfile:

source :rubygems  
gem 'gemfromrubygems1'  
gem 'gemfromrubygems2'

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

4 回答 4

47

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

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

于 2014-08-14T05:19:18.193 回答
6

根据Gemfile 手册页中的 Source Priority 部分,从最后输入到第一个输入搜索源。

根据您所说,听起来您希望始终更喜欢您的 gem 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'
于 2013-09-18T20:22:39.957 回答
4

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

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

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

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

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

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

于 2013-04-18T01:02:29.020 回答
1

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

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

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

于 2013-08-27T19:37:50.420 回答