web-dev-qa-db-fra.com

Quel est l'intérêt de placer "package-lock.json" de npm sous contrôle de version?

Quel est l'intérêt de placer le package-lock.json de npm sous contrôle de version? D'après mon expérience, le contrôle de cette source de fichiers a causé plus de problèmes et de confusion que de gains d'efficacité.

Avoir package-lock.json sous contrôle de source crée un mal de tête majeur à chaque fois qu'un développeur qui ajoute/supprime/modifie un module de noeud doit résoudre les conflits entre les branches. Travailler particulièrement sur des applications complexes/volumineuses où package-lock.json peut contenir des dizaines de milliers de lignes. Même en supprimant node_modules et en exécutant un nouveau npm install, vous pouvez générer des changements radicaux dans le verrouillage du paquet.

Il y a plusieurs autres SO questions sur le verrou de paquet:

Et un problème GitHub avec une tonne de conversation sur le verrouillage de paquet:

Ce qui me fait penser qu'il existe encore une incertitude généralisée qui doit être éclaircie.

Selon les docs 

package-lock.json est automatiquement généré pour toutes les opérations où npm modifie l'arborescence node_modules ou package.json. 

Alors, pourquoi voudriez-vous jamais placer un fichier généré automatiquement sous contrôle de source?

Le problème GitHub ci-dessus explique comment certaines personnes, en raison d'une confusion avec le package-lock.json, modifient leur script npm install en rm -f package-lock.json && npm install, ce qui ne semble pas non plus correct.

Il semble que package-lock.json s'efforce d'être la source de la vérité pour la version exacte des dépendances de module de noeud, mais n'est-ce pas exactement ce que fait le package.json? Quand la douleur insoutenable liée à la résolution des conflits de fusion dans ce fichier commence-t-elle à porter ses fruits?

14
Cumulo Nimbus

D'après mon expérience, il est inutile de placer package-lock.json sous contrôle de version. Cela fait de la gestion de grandes fusions/réassemblages un cauchemar. Cependant, il y a des cas où le paquet-lock peut être très utile.

Récemment (2017/10/10), moment.js a introduit des modifications importantes dans une mise à jour de version mineure . Cela signifie que si l'un d'entre eux devait être expédié sans package-lock.json, et que quelque chose comme cela se trouvait dans leur package.json

"moment": "^2.12.0"

Certaines des dernières modifications introduites dans la version 2.19.0 infiltreraient votre code sans aucune trace.

C’est pourquoi après couper une branche pour servir de release candidate il est crucial de:

  • supprimer package-lock.json de .gitignore
  • lancez npm install pour générer un package-lock.json
  • test, qa, déploie avec ce paquet-lock

Cela garantit que les versions de votre module npm resteront verrouillées sur les mêmes versions que celles testées.

8
Cumulo Nimbus

Créez une entrée .gitattributes:

# common settings that generally should always be used with your language specific settings

# Auto detect text files and perform LF normalization
* text=auto

#
# The above will handle all files NOT found below
#

#*.svg text
*.lock binary

Ensuite, lorsque vous fusionnerez, il vous suffira de choisir une version vs un code fusionné. Pensé que vous pourriez rencontrer des conflits de paquets de cette façon.

Nous avons atténué cela en vérifiant les versions dans le processus de construction.

3
Fitch

IMO package-lock.json (ou yarn-lock.json) devrait toujours être affecté au contrôle de source. Conflits de fusion/rebase mis à part (qui sont largement atténués par yarn BTW - vous pouvez yarn install mi-rebase pour résoudre les problèmes automatiquement), il est de la meilleure garantie que le code de cette validation soit construit et exécuté correctement après une nouvelle vérification .

0
linguamachina