Gemfile 中新块 “git_source(:github)” 的含义

Meaning of new block "git_source(:github)" in Gemfile

提问人:Ουιλιαμ Αρκευα 提问时间:1/4/2017 最后编辑:jm3Ουιλιαμ Αρκευα 更新时间:3/27/2020 访问量:12464

问:

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

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

它的含义是什么?每个新应用都是强制性的吗?

Ruby-on-Rails 打包器 gemfile

评论


答:

68赞 max 1/4/2017 #1

它是 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 将尝试从 下载 gem。https://github.com/foo/bar.git

由于修复此问题将是一个重大更改,因为它会使任何现有的 Gemfile.lock 失效,因此它在 Bundler 2.x 中已修复。此时,删除此变通办法应该是安全的。

评论

0赞 Ουιλιαμ Αρκευα 1/4/2017
那么,这是最近更新的某个宝石的错误吗?哪颗宝石?
1赞 Stefan 1/18/2018
解决此问题的另一种方法是将bundle config github.https true
1赞 max 2/26/2018
真正的@Stefan。但是,任何团队的安全都取决于其最懒惰的成员。
18赞 Paul J 1/8/2017 #2

Bundler :github 指令将从 (source) 获取,它使用不安全的协议。git://github.com/#{repo_name}.githttp

这将在将来的 Bundler 版本中修复,但此代码段被添加到 Gemfile 的顶部,以确保在 Bundler 1 中使用。https

8赞 Obromios 4/21/2017 #3

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

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