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

问题描述 投票:0回答:4

最近我创建了一个新的 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 bundler gemfile
4个回答
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 中修复。此时,删除此解决方法应该是安全的。


18
投票

Bundler :github 指令将从

git://github.com/#{repo_name}.git
(source) 获取,该指令使用不安全的
http
协议。

这将在未来的 Bundler 版本中得到修复,但此代码片段被添加到 Gemfile 的顶部,以确保

https
在 Bundler 1 中使用。


8
投票

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

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

0
投票

你甚至可以这样做:

git_source(:rails) { |name| "https://github.com/rails/#{name}" }

gem "rails", rails: :rails
© www.soinside.com 2019 - 2024. All rights reserved.