web-dev-qa-db-fra.com

Comprendre le fichier Gemfile.lock

Après l'exécution de la commande bundle install _, 'Gemfile.lock' est créé dans le répertoire de travail. Que signifient les directives contenues dans ce fichier?

Par exemple, prenons le fichier suivant:

PATH
  remote: .
  specs:
    gem_one (0.0.1)

GEM
  remote: http://example.org/
  specs:
    gem_two (0.0.2)
    gem_three (0.0.3)
      gem_four (0.0.4)

PLATFORMS
  platform

DEPENDENCIES
  gem_two
  gem_one!

Que font 'CHEMIN', 'BIJOU', 'PLATES-FORMES' et 'DÉPENDANCES 'décris? Sont-ils tous nécessaires?

Que doivent contenir les sous-directives 'remote' et 'specs'?

Que signifie le point d'exclamation après le nom de la gemme dans le groupe 'DEPENDECIES'?

173
Shamaoke

Vous pouvez trouver plus d'informations à ce sujet dans le site Web de groupe (accentuation ajoutée ci-dessous pour votre commodité):

Après avoir développé votre application pendant un certain temps, archivez-la avec le fichier Gemfile et Gemfile.lock . Maintenant, votre référentiel a un enregistrement des versions exactes de toutes les gemmes que vous avez utilisées la dernière fois que vous savez avec certitude que l'application a fonctionné ...

Ceci est important: le fichier de Gemfile.lock transforme votre application en un seul paquet contenant à la fois votre propre code et celui du code tiers qu’il a exécuté la dernière fois que vous le savez. à coup sûr que tout a fonctionné. Spécifier des versions exactes du code tiers dont vous dépendez dans votre Gemfile ne fournirait pas la même garantie, car les gems déclarent généralement une plage de versions pour leurs dépendances.

73

en ce qui concerne le point d'exclamation, je viens de découvrir qu'il s'agit de gemmes récupérées via :git, par exemple.

gem "foo", :git => "[email protected]:company/foo.git"
35
agenteo

J'ai passé les derniers mois à bricoler Gemfiles et Gemfile.Locks beaucoup lors de la création d'un outil de mise à jour automatique des dépendances.1. Le texte ci-dessous est loin d’être définitif, mais c’est un bon point de départ pour comprendre le format Gemfile.lock. Vous pouvez également consulter le code source de l’analyseur de fichiers de verrouillage de Bundler .

Vous trouverez les en-têtes suivants dans un fichier de verrouillage généré par Bundler 1.x:

GEM (facultatif mais très commun)

Ce sont des dépendances provenant d'un serveur Rubygems. Il peut s’agir du principal index Rubygems, sur Rubygems.org, ou d’un index personnalisé, tel que ceux disponibles chez Gemfury et d’autres. Dans cette section, vous verrez:

  • remote: une ou plusieurs lignes spécifiant l'emplacement du ou des index (s) Rubygems
  • specs: une liste de dépendances, avec leur numéro de version et les contraintes sur les sous-dépendances

GIT (facultatif)

Ce sont des dépendances provenant d'une télécommande git donnée. Vous verrez une de ces sections différente pour chaque télécommande git, et dans chaque section, vous verrez:

  • remote: la télécommande git. Par exemple, [email protected]:Rails/rails
  • revision: la référence de validation sur laquelle Gemfile.lock est verrouillé
  • tag: (facultatif) la balise spécifiée dans le Gemfile
  • specs: la dépendance de git trouvée sur cette télécommande, avec son numéro de version et les contraintes sur les sous-dépendances

CHEMIN (facultatif)

Ce sont des dépendances provenant d'un path donné, fournies dans le Gemfile. Vous verrez une de ces sections différente pour chaque dépendance de chemin, et dans chaque section, vous verrez:

  • remote: le chemin. Par exemple, plugins/vendored-dependency
  • specs: la dépendance de git trouvée sur cette télécommande, avec son numéro de version et les contraintes sur les sous-dépendances

PLATEFORMES

La plateforme Ruby à laquelle le fichier Gemfile.lock a été généré. Si des dépendances dans le Gemfile spécifient une plate-forme, elles ne seront incluses dans le fichier Gemfile.lock que lorsque le fichier de verrouillage est généré sur cette plate-forme (par exemple, via une installation).

DÉPENDANCES

Une liste des dépendances spécifiées dans Gemfile, ainsi que la contrainte de version spécifiée ici.

Les dépendances spécifiées avec une source autre que l'index Rubygems principal (par exemple, dépendances git, basées sur un chemin, dépendances) ont un !, ce qui signifie qu'elles sont "épinglées" sur cette source.2 (bien qu'il faille parfois regarder dans le Gemfile pour le déterminer).

Ruby VERSION (facultatif)

La version Ruby spécifiée dans le fichier Gemfile lors de la création de ce fichier Gemfile.lock. Si une version Ruby est spécifiée dans un fichier .Ruby_version, cette section ne sera pas présente (Bundler considérera l'agnostique Gemfile/Gemfile.lock dans la version Ruby de l'installateur. ).

BUNDLED WITH (Bundler> = v1.10.x)

La version de Bundler utilisée pour créer le fichier Gemfile.lock. Utilisé pour rappeler aux installateurs de mettre à jour leur version de Bundler, si celle-ci est antérieure à la version qui a créé le fichier.

PLUGIN SOURCE (optionnel et très rare)

En théorie, un Gemfile peut spécifier des plugins Bundler, ainsi que des gemmes3, qui seraient alors listés ici. En pratique, à la date de juillet 2017, je ne connaissais aucun plugin disponible. Cette partie de Bundler est toujours en cours de développement!


  1. https://dependabot.com
  2. https://github.com/bundler/bundler/issues/4631
  3. http://andre.arko.net/2012/07/23/towards-a-bundler-plugin-system/
25
greysteil

Il me semble que PATH répertorie les dépendances de première génération directement à partir de votre gemspec, alors que GEM répertorie les dépendances de deuxième génération (c’est-à-dire de ce dont dépendent vos dépendances) et celles de votre Gemfile. PATH :: remote est . parce qu'il s'appuie sur un gemspec local dans le répertoire en cours pour savoir ce qui appartient à PATH :: spec, alors que GEM :: remote est rubygems.org, car c'est là qu'il fallait allez voir ce qui appartient à GEM :: spec.

Dans un plug-in Rails, vous verrez une section PATH, mais pas dans une application Rails. Puisque l'application ne possède pas de fichier gemspec, il n'y aurait rien à mettre dans PATH.

En ce qui concerne DEPENDENCIES, gembundler.com déclare:

Runtime dependencies in your gemspec are treated like base dependencies, 
and development dependencies are added by default to the group, :development

Le Gemfile généré par Rails plugin new my_plugin dit quelque chose de similaire:

# Bundler will treat runtime dependencies like base dependencies, and
# development dependencies will be added by default to the :development group.

Cela signifie que la différence entre

s.add_development_dependency "july" # (1)

et

s.add_dependency "july" # (2)

est-ce que (1) inclura seulement "juillet" dans Gemfile.lock (et donc dans l'application) dans un environnement de développement. Ainsi, lorsque vous exécuterez bundle install, vous verrez "juillet" non seulement sous PATH, mais également sous DEPENDENCIES, mais uniquement en développement. En production, il n'y en aura pas du tout. Cependant, lorsque vous utilisez (2), vous verrez "juillet" uniquement dans PATH, pas dans DEPENDENCIES, mais il apparaîtra lorsque vous bundle install à partir d'un environnement de production (c'est-à-dire dans un autre joyau incluant le vôtre, par exemple). une dépendance), pas seulement le développement.

Ce ne sont que mes observations et je ne peux pas expliquer en détail pourquoi tout cela est ainsi, mais je me réjouis des autres commentaires.

8
Isaac Betesh

Bundler est un gestionnaire de gemmes qui fournit un environnement cohérent pour les projets Ruby en effectuant un suivi et en installant les gems et les versions nécessaires.

Gemfile et Gemfile.lock sont les principaux produits offerts par Bundler gem (Bundler lui-même est une gemme).

Gemfile contient la dépendance de votre projet vis-à-vis de gemmes, que vous mentionnez manuellement avec la ou les versions spécifiées, mais ces gemmes dépendent à présent d’autres gemmes résolues automatiquement par bundler.

Gemfile.lock contient un instantané complet de toutes les gemmes dans Gemfile, ainsi que leurs dépendances associées.

Lorsque vous appelez pour la première fois installation groupée , il créera ce fichier Gemfile.lock et utilisera ce fichier lors de tous les appels ultérieurs pour l'installation groupée, ce qui garantit que toutes les dépendances sont installées et que celles-ci sont ignorées.

La même chose se produit lorsque vous partagez votre code avec différentes machines

Vous partagez votre Gemfile.lock avec Gemfile. Lorsque vous exécutez l’installation en bundle sur une autre machine, il fait référence à votre étape Gemfile.lock et ignore la résolution de la dépendance, mais installe tous les mêmes gems dépendants que ceux que vous avez utilisés sur le serveur. machine d'origine, qui maintient la cohérence sur plusieurs machines

Pourquoi devons-nous maintenir la cohérence sur plusieurs machines?

  • L'exécution de différentes versions sur différentes machines peut conduire à un code cassé

  • Supposons que votre application utilise la version 1.5.3 et qu'elle fonctionne il y a 14 mois.
    sans aucun problème, et vous essayez d'installer sur une machine différente
    Sans Gemfile.lock, vous obtenez maintenant la version 1.5.8. Peut-être qu'il est cassé avec la dernière version de certaines gemmes et votre application sera
    échouer. Le maintien de la cohérence est de la plus haute importance (préféré
    entraine toi).

Il est également possible de mettre à jour gem (s) dans Gemfile.lock en utilisant bundle update .

Ceci est basé sur le concept de mise à jour conservatrice

8
Keshav

Il semble qu'aucun document clair ne parle du format Gemfile.lock. Peut-être est-ce parce que Gemfile.lock est simplement utilisé par bundle en interne.

Cependant, puisque Gemfile.lock est un instantané de Gemfile, ce qui signifie que toutes ses informations doivent provenir de Gemfile (ou de la valeur par défaut si non spécifié dans Gemfile).

Pour GEM, il répertorie toutes les dépendances que vous introduisez directement ou indirectement dans le Gemfile. remote sous GEM indique où obtenir les pierres précieuses, ce qui est spécifié par source dans Gemfile.

Si une gemme n'est pas extraite de remote, PATH indique l'emplacement pour le trouver. Les informations de PATH proviennent de chemin dans Gemfile lorsque vous déclarez une dépendance.

Et PLATFORM est de ici .

Pour DEPENDENCIES, il s'agit de l'instantané des dépendances résolues par bundle.

2
Hong

Le point d'exclamation apparaît lorsque la gem a été installée à l'aide d'une source autre que " https://rubygems.org ".

.

0
SWiggels