web-dev-qa-db-fra.com

Signification du nouveau bloc "git_source (: github)" dans Gemfile

Récemment, j'ai créé une nouvelle application Rails 5, sans référentiel git. Le Gemfile généré automatiquement contient un nouveau bloc que je n'avais jamais vu auparavant:

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

Quelle en est la signification? Est-ce obligatoire pour chaque nouvelle application?

C'est un morceau de code hérité et devrait très probablement être supprimé.

Ajouté: C'est une solution de contournement pour un bogue dans Bundler qui peut provoquer le chargement des sources de github via HTTP et non HTTPS - ce qui le rend vulnérable à l'homme dans les attaques du milieu.

git_source ajoute une source que vous pouvez utiliser pour que la gemme soit téléchargée depuis un dépôt git au lieu d'un paquet depuis 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

Je ferais en sorte que lorsque vous déclarez:

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

Bundler tenterait de télécharger la gemme depuis https://github.com/foo/bar.git.

Puisque corriger cela serait un changement de rupture car cela invaliderait tout Gemfile.lock existant, il est corrigé dans Bundler 2.x. À ce stade, il devrait être sûr de supprimer cette solution de contournement.

47
max

La directive Bundler: github va chercher à partir de git://github.com/#{repo_name}.git ( source ), qui utilise le protocole http non sécurisé.

Cela devrait être corrigé dans les futures versions de Bundler, mais cet extrait est ajouté en haut du Gemfile pour garantir que https est utilisé dans Bundler 1.

15
Paul J

Si vous ne souhaitez pas ajouter ce code à votre gemfile mais souhaitez toujours accéder en toute sécurité à un gem à partir de github, vous pouvez utiliser la méthode suivante:

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