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?
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:
npm install
pour générer un package-lock.jsonCela garantit que les versions de votre module npm resteront verrouillées sur les mêmes versions que celles testées.
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.
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 .