npm 5 est sorti aujourd'hui et l'une des nouvelles fonctionnalités inclut des installations déterministes avec la création d'un package-lock.json
fichier.
Ce fichier est-il censé être conservé sous contrôle de code source?
Je suppose que c'est similaire à yarn.lock
et composer.lock
, qui sont tous deux censés rester sous contrôle de source.
git log
plus facile à gérer.Réponses:
Oui,
package-lock.json
est destiné à être vérifié dans le contrôle de code source. Si vous utilisez npm 5, vous pouvez voir ceci sur la ligne de commande:created a lockfile as package-lock.json. You should commit this file.
Selonnpm help package-lock.json
:la source
package-lock.json
à mon.gitignore
... cela me posait beaucoup plus de problèmes que de les résoudre. Il y a toujours des conflits lorsque nous fusionnons ou rebasons, et lorsqu'une fusion entraîne unepackage-lock.json
corruption sur le serveur CI, c'est juste une douleur de devoir continuer à le réparer.Oui, il est destiné à être enregistré. Je veux suggérer qu'il obtient son propre commit unique. Nous constatons que cela ajoute beaucoup de bruit à nos diffs.
la source
package-lock.json
fichier lorsque vous travaillez sur un système SCM avec des troncs et des branchements? J'effectue des modifications sur une branche qui doit être fusionnée dans le tronc ... dois-je maintenant (en quelque sorte) résoudre les conflits entre les deuxpackage-lock.json
fichiers? C'est douloureux.Oui tu devrais:
package-lock.json
.npm ci
au lieu denpm install
lors de la création de vos applications sur votre CI et votre machine de développement localeLe
npm ci
workflow nécessite l'existence d'unpackage-lock.json
.Un gros inconvénient de la
npm install
commande est son comportement inattendu qui peut muterpackage-lock.json
, alors qu'ilnpm ci
n'utilise que les versions spécifiées dans le fichier de verrouillage et produit une erreurpackage-lock.json
et nepackage.json
sont pas synchroniséspackage-lock.json
manque un.Par conséquent, fonctionnant
npm install
localement, esp. dans des équipes plus grandes avec plusieurs développeurs, cela peut conduire à de nombreux conflits au sein dupackage-lock.json
et les développeurs peuvent décider de supprimer complètement le à lapackage-lock.json
place.Pourtant, il existe un cas d'utilisation solide pour pouvoir croire que les dépendances du projet se résolvent de manière répétée et fiable sur différentes machines.
D'un
package-lock.json
vous obtenez exactement cela: un état connu pour fonctionner.Dans le passé, j'avais des projets sans
package-lock.json
/npm-shrinkwrap.json
/yarn.lock
fichiers dont la construction échouait un jour parce qu'une dépendance aléatoire avait une mise à jour de rupture.Ces problèmes sont difficiles à résoudre car vous devez parfois deviner quelle était la dernière version de travail.
Si vous souhaitez ajouter une nouvelle dépendance, vous exécutez toujours
npm install {dependency}
. Si vous souhaitez mettre à niveau, utilisez soitnpm update {dependency}
ounpm install ${dependendency}@{version}
et validez la modificationpackage-lock.json
.Si une mise à niveau échoue, vous pouvez revenir au dernier fonctionnement connu
package-lock.json
.Pour citer npm doc :
Et en ce qui concerne la différence entre
npm ci
vsnpm install
:Remarque: j'ai posté une réponse similaire ici
la source
whose build would fail one day because a random dependency got a breaking update
genre de problème. Bien que cela laisse la possibilité d'une dépendance de l'enfant causant le même problème.Oui, la meilleure pratique consiste à s'enregistrer (OUI, ENREGISTREMENT)
Je suis d'accord que cela causera beaucoup de bruit ou de conflit en voyant la différence. Mais les avantages sont:
^1.2.3
dans votrepackage.json
, mais comment pouvez-vous vous assurer que chaque foisnpm install
récupérera la même version sur votre machine de développement et sur le serveur de build, en particulier ces packages de dépendance indirecte? Eh bien,package-lock.json
je m'en assurerai. (À l'aide denpm ci
laquelle installe des packages basés sur le fichier de verrouillage)npm audit fix
(je pense que la fonctionnalité d'audit est de npm version 6).la source
npm ci
. Les gens mentionnent fréquemment que apackage-lock.json
permet une installation déterministe des packages mais ne mentionnent presque jamais la commande qui facilite ce comportement! Beaucoup de gens pensent probablement à tortnpm install
installations exactement ce qui est dans le fichier de verrouillage ...npm ci
. Votre équipe / développeur principal peut décider du moment de la mise à jour. Si tout le monde le commet arbitrairement, cela ne sert à rien, et cela crée juste du bruit dans votre référentiel. La documentation NPM devrait rendre cela plus clair. Je pense que la plupart des développeurs sont simplement confus par cette fonctionnalité.Je ne valide pas ce fichier dans mes projets. À quoi ça sert ?
Bien qu'il soit vrai que je n'utilise jamais ^ dans mon package.json pour les bibliothèques car j'ai eu de mauvaises expériences avec.
la source
package-lock.json
. Certains référentiels peuvent ne pas nécessiter les avantages qui en découlent et peuvent préférer ne pas avoir de contenu généré automatiquement dans la source.Aux personnes qui se plaignent du bruit en faisant git diff:
J'ai utilisé un alias:
Pour ignorer package-lock.json dans diffs pour l'ensemble du référentiel (tous ceux qui l'utilisent), vous pouvez ajouter ceci à
.gitattributes
:Cela se traduira par des différences qui affichent "les fichiers binaires a / package-lock.json et b / package-lock.json diffèrent chaque fois que le fichier de verrouillage du package a été modifié. De plus, certains services Git (notamment GitLab, mais pas GitHub) excluront également ces fichiers (plus de 10 000 lignes modifiées!) des diffs lors de la visualisation en ligne en faisant cela.
la source
gd() { git diff --color-words $1 $2 -- :!/yarn.lock :!/package-lock.json; }
dans mon .bashrc au lieu d'un alias.Oui, vous pouvez valider ce fichier. Extrait des documents officiels du npm :
la source
npm ci
installation à partir du package-lock.jsonDésactiver globalement package-lock.json
tapez ce qui suit dans votre terminal:
ça marche vraiment pour moi comme par magie
la source
~/.npmrc
(au moins sur mes macos) avec du contenupackage-lock=false
et la même chose peut être faite dans n'importe quel projet spécifique à côténode_modules/
(par exempleecho 'package-lock=false' >> .npmrc
Oui, c'est une pratique standard pour valider package-lock.json
La principale raison de la validation de package-lock.json est que tout le monde dans le projet est sur la même version de package.
Avantages:-
Les inconvénients:-
Edit: - npm install ne s'assurera pas que tout le monde dans le projet est sur la même version de package. npm ci vous y aidera.
la source
npm ci
au lieu denpm install
.Mon utilisation de npm est de générer des css / js minifiés / uglifiés et de générer le javascript nécessaire dans les pages servies par une application django. Dans mes applications, Javascript s'exécute sur la page pour créer des animations, parfois effectuer des appels ajax, travailler dans un framework VUE et / ou travailler avec le css. Si package-lock.json a un certain contrôle sur ce qui se trouve dans package.json, il peut être nécessaire qu'il existe une version de ce fichier. D'après mon expérience, cela n'affecte pas ce qui est installé par npm install, ou si c'est le cas, cela n'a pas affecté à ce jour les applications que je déploie à ma connaissance. Je n'utilise pas mongodb ou d'autres applications similaires qui sont traditionnellement des clients légers.
Je supprime package-lock.json du référentiel car l'installation de npm génère ce fichier et l'installation de npm fait partie du processus de déploiement sur chaque serveur qui exécute l'application. Le contrôle de version du nœud et de npm se fait manuellement sur chaque serveur, mais je fais attention à ce qu'ils soient les mêmes.
Lorsqu'il
npm install
est exécuté sur le serveur, il modifie package-lock.json, et s'il y a des modifications dans un fichier enregistré par le référentiel sur le serveur, le prochain déploiement WONT vous permet d'extraire de nouvelles modifications de l'origine. Autrement dit, vous ne pouvez pas déployer, car l'extraction écrasera les modifications apportées à package-lock.json.Vous ne pouvez même pas écraser un package-lock.json généré localement avec ce qui est sur le référentiel (réinitialiser le maître d'origine dur), car npm se plaindra chaque fois que vous émettez une commande si le package-lock.json ne reflète pas ce qui se trouve dans node_modules en raison de l'installation de npm, interrompant ainsi le déploiement. Maintenant, si cela indique que des versions légèrement différentes ont été installées dans node_modules, encore une fois cela ne m'a jamais posé de problème.
Si node_modules n'est pas sur votre dépôt (et il ne devrait pas l'être), alors package-lock.json doit être ignoré.
Si je manque quelque chose, corrigez-moi dans les commentaires, mais le fait que la version est extraite de ce fichier n'a aucun sens. Le fichier package.json contient des numéros de version, et je suppose que ce fichier est celui utilisé pour créer des packages lorsque l'installation de npm se produit, car lorsque je le supprime, l'installation de npm se plaint comme suit:
et la construction échoue, cependant lors de l'installation de node_modules ou de l'application de npm pour construire js / css, aucune plainte n'est faite si je supprime package-lock.json
la source