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

Posted

技术标签:

【中文标题】Gemfile 中新块“git_source(:github)”的含义【英文标题】:Meaning of new block "git_source(:github)" in Gemfile 【发布时间】:2017-05-18 04:25:06 【问题描述】:

最近我创建了一个新的 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

这是什么意思?每个新应用都必须这样做吗?

【问题讨论】:

【参考方案1】:

这是 Bundler 中的一个错误的解决方法,该错误可能导致来自 github 的源通过 HTTP 而不是 HTTPS 加载 - 这使得它容易受到中间人攻击。

git_source 添加了一个您可以使用的源,以便从 git 存储库而不是来自 rubygems.org 的包下载 gem。

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。

由于fixing this would be a breaking change 会使任何现有的 Gemfile.lock 无效,因此它已在 Bundler 2.x 中得到修复。此时,删除此解决方法应该是安全的。

【讨论】:

那么,这是最近更新的某个 gem 的错误吗?哪个宝石? 解决此问题的另一种方法是设置bundle config github.https true 真@Stefan。但是任何团队都只有最懒惰的成员才安全。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

这将在未来的 Bundler 版本中得到修复,但这个 sn-p 被添加到 Gemfile 的顶部以确保 https 在 Bundler 1 中使用。

【讨论】:

以上是关于Gemfile 中新块“git_source(:github)”的含义的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 中的 Gemfile 和 Gemfile.lock 有啥区别

Ruby 中的“Gemfile”在哪里?

理解 Gemfile.lock:删除 Gemfile.lock 然后再次运行 bundle install 可以吗?

Gemfile.lock 包含合并冲突

在 Gemfile 中设置 ruby​​ 版本

如何为 Gemfile 指定最低捆绑器版本?