web-dev-qa-db-fra.com

Quelle est la difference entre yarn.lock et npm's shrinkwrap?

Récemment, j’ai essayé d’installer mes Node paquets avec Yarn. Cela fonctionne très bien et est beaucoup plus rapide que NPM. Yarn génère automatiquement yarn.lock. Nous avons déjà NPM shrinkwrap (npm-shrinkwrap.json).

Y a-t-il une différence entre eux? Est-ce que yarn.lock a-t-il un avantage sur npm-shrinkwrap.json?

53
Fizer Khan

Le fichier yarn.lock Est assez similaire aux fichiers de verrouillage des autres gestionnaires de packages, en particulier le gestionnaire de packages Cargo de Rust, qui contient Cargo.lock. L'idée de ces fichiers de verrouillage est de représenter un ensemble cohérent de packages qui devraient toujours fonctionner.

npm stocke les plages de dépendance dans le fichier package.json, ce qui signifie que, si quelqu'un installe votre paquet, il risque d'obtenir un ensemble de dépendances différent, car vous exécutez peut-être des paquets obsolètes satisfaire la plage de dépendance que vous avez spécifiée). Prenons, par exemple, une personne qui a spécifié la dépendance "foo": "^1.0.0". Ils ont peut-être réellement installé foo v1.0.1, car c’était la dernière en date du moment où ils ont exécuté npm install, Mais plus tard, quelqu'un installe votre paquet et obtient la dépendance foo v1.1.0. Cela pourrait casser quelque chose de façon inattendue, ce qui peut être évité si vous avez un fichier yarn.lock Qui garantit une résolution de paquet cohérente .

Quant à la comparaison avec npm shrinkwrap, la documentation l'explique très clairement:

Il est similaire à npm-shrinkwrap.json de npm, mais il ne génère pas de perte et génère des résultats reproductibles.

La documentation recommande également de valider yarn.lock Dans vos référentiels, si ce n'est déjà fait, afin que vous puissiez profiter des avantages d'une résolution de paquet cohérente et reproductible. Cette question explique également pourquoi vous devriez le faire.

Le comportement avec perte de npm shrinkwrap Est dû aux algorithmes non déterministes utilisés par npm lui-même; Comme indiqué dans les commentaires d'une autre réponse, il n'est pas garanti que npm shrinkwrap> npm install> npm shrinkwrap produira le même résultat qu'un simple rétrécissement, alors que Yarn utilise explicitement "un algorithme d'installation qui est déterministe et fiable" .

50
Aurora0001

Y a-t-il une différence entre eux

Le fil suit un algorithme plus déterministe, comparé à npm shrinkwrap. Si vous utilisez Yarn, continuer à utiliser le shrinkwrap serait contre-intuitif.

Vous pouvez le trouver dans le documentation pour yarn.lock :

Il est similaire à npm-shrinkwrap.json de npm, mais il ne génère pas de perte et crée des résultats reproductibles.

Cependant, la question reste de savoir si le fil est prêt pour la production. Il y a encore beaucoup d'insectes flagrants sur le dépôt GitHub, je l'attendrais donc pendant environ un mois.

5
nikjohn