web-dev-qa-db-fra.com

Quelle est la différence entre Gemfile et Gemfile.lock dans Ruby sur Rails

Je suis un débutant à Ruby sur Rails et j'utilise Rails 3.0.9.

Quelle est la difference entre Gemfile et Gemfile.lock dans Rails?

115
Shamith c

Le Gemfile est l'endroit où vous spécifiez les gems que vous souhaitez utiliser et vous permet de spécifier les versions.

Le fichier Gemfile.lock Est l'endroit où Bundler enregistre les versions exactes installées. Ainsi, lorsque la même bibliothèque/projet est chargé sur une autre machine, exécuter bundle install Examinera le Gemfile.lock Et installera les mêmes versions, plutôt que d'utiliser simplement le Gemfile et installer les versions les plus récentes. (Exécuter différentes versions sur différentes machines peut entraîner des tests erronés, etc.) Vous ne devriez jamais avoir à éditer directement le fichier de verrouillage.

Consultez objectif et justification de Bundler , en particulier la section Vérification de votre code dans le contrôle de version.

147
Dylan Markow

Généralement, nous écrivons des dépendances dans Gemfile en tant que:

gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-Ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..

Ici, vous dites essentiellement: " Je veux nokogiri tant qu'il est supérieur à la version 1.4.4 ", etc. Supposons maintenant que j'ai configuré mon Gemfile Il y a 8 mois et j'ai réussi à configurer mon application avec cette exigence. Il y a 8 mois la version nokogiri était 1.4.4 . Mon Rails applications fonctionnait parfaitement sans aucun problème avec cette version.

Maintenant, pensez que j'essaie de construire avec le même Gemfile. Mais si nous regardons versions nokogiri , nous voyons que la version stable actuelle a été remplacée par 1.4.9 . Cela signifie que si nous essayons de construire, bundler installera la version 1.4.9 de nokogiri (supposons que nous n’ayons pas Gemfile.lock).

Qu'est-ce que ça veut dire ?

Comme vous voyez si vous n'avez pas de Gemfile.lock et courir:

bundle install

alors les gemmes actuellement utilisées peuvent être différentes à tout moment . Votre application a utilisé la version 1.4.4 et cela fonctionne il y a 8 mois sans aucun problème, mais si vous essayez de le construire maintenant , vous obtenez la version 1.4.9 . Peut-être que c'est cassé avec la dernière version de nokogiri, la fonctionnalité géniale que vous avez utilisée avec 1.4.4 n'est plus disponible, etc.

Pour éviter ce genre de problème Gemfile.lock est utilisé. Dans Gemfile.lock seules les versions exactes sont écrites et seules celles-ci seront installées. Cela signifie que si vous distribuez votre application avec un Gemfile.lock, chaque machine aura les mêmes gemmes installées et le plus important toutes auront la même version . Cela vous donnera une pile de déploiement stable et commune.

Comment est créé Gemfile.lock?

Il est automatiquement créé avec le premier:

bundle install

commander. Après cela, à chaque fois que vous exécutez bundle install, le paquet va d'abord chercher Gemfile.lock et installez les gemmes spécifiées ici. C'est une habitude de répartir ce fichier entre vos projets pour assurer une stabilité et une cohérence.

Comment mettre à jour Gemfile.lock?

Si vous êtes satisfait de la dernière version de vos applications, vous pouvez mettre à jour Gemfile.lock. Il suffit de refléter vos modifications sur Gemfile. Cela signifie que vous devez remplacer les dépendances par les nouvelles versions exactes dans Gemfile. Après cette course:

bundle install

Cela vous mettra à jour Gemfile.lock avec votre dernière version des applications.

145
Fatih Arslan

Le Gemfile.lock

Lorsque vous exécutez l’installation d’un ensemble, Bundler conserve les noms complets et les versions de tous les gems que vous avez utilisés (y compris les dépendances des gems spécifiés dans Gemfile (5)) dans un fichier nommé Gemfile.lock.

Bundler utilise ce fichier dans tous les appels ultérieurs relatifs à l'installation d'un ensemble, ce qui garantit que vous utilisez toujours le même code exact, même lorsque votre application se déplace sur plusieurs ordinateurs.

En raison du fonctionnement de la résolution de dépendance, même un changement apparemment mineur (par exemple, une mise à jour ponctuelle de la dépendance d'une gemme dans votre Gemfile (5)) peut entraîner la nécessité de gemmes radicalement différentes pour satisfaire toutes les dépendances.

En conséquence, vous DEVEZ vérifier votre Gemfile.lock dans le contrôle de version. Si vous ne le faites pas, chaque machine qui extrait votre référentiel (y compris votre serveur de production) résoudra à nouveau toutes les dépendances, ce qui entraînera l’utilisation de différentes versions du code tiers si l’un des gems de Gemfile (5) ou de leurs dépendances ont été mis à jour.

3
Ajey