Gemfile 中新块 "git_source(:github)" 的含义是什么?

64

最近我创建了一个不带git仓库的新的Rails 5应用程序。自动生成的Gemfile包含一个我以前从未见过的新块:

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

它的意思是什么?每个新应用都必须使用它吗?

3个回答

68
这是对Bundler中的一个错误的解决方法,该错误可能导致从github获取的源通过HTTP而不是HTTPS加载——这使其容易受到中间人攻击的影响。 git_source添加了一个源,你可以使用它来从git存储库下载gem,而不是从rubygems.org下载软件包。
git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

会使您在声明时这样做:

gem 'foo_bar', :github => 'foo/bar'

Bundler会尝试从https://github.com/foo/bar.git下载gem包。

由于修复这个问题将是一个破坏性的改变,因为它会使现有的Gemfile.lock失效,所以在Bundler 2.x中修复了该问题。此时应该安全地删除这个解决方法。


那么,这是最近更新的某个 gem 的错误吗?是哪个 gem? - Ουιλιαμ Αρκευα
1
解决这个问题的另一种方法是设置 bundle config github.https true - Stefan
1
没错,@Stefan。但是任何团队的安全性都取决于最懒惰的成员。 - max

18

Bundler :github 指令将从git://github.com/#{repo_name}.git (源代码) 获取资源,该资源使用不安全的http协议。

这个问题将在未来的Bundler版本中修复,但是可以在Gemfile文件的顶部添加以下代码片段来确保在Bundler 1中使用https


8

如果您不想将此代码添加到您的gemfile但仍然希望安全地从github访问gem,则可以使用以下方法:

gem 'foo_bar', git: 'https://github.com/foo/bar.git

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接