web-dev-qa-db-fra.com

Comment remplacer les dépendances imbriquées avec `yarn`?

Si mon paquet a ces dépendances

{ "name": "my-package",
  "dependencies": { "foobar":"~1.0.3", "baz":"2.0.9" }

Et le paquet foobar a ces dépendances

{ "name": "foobar",
  "dependencies": { "baz":"^2.0.0" }

et la version la plus récente de baz est 2.1.0, la première exécution de yarn installera [email protected] dans foobar/node_modules.

Comment forcer le fil à utiliser le [email protected] package pour foobar?

Je crois comprendre que cela serait possible en utilisant npm shrinkwrap (a la cette question ).


Le résumé de ma question est probablement le suivant: Yarn crée des installations déterministes répétables, mais comment puis-je personnaliser cette installation?

59
Chris W.

Si vous avez réellement une sous-dépendance trop restrictive dans les versions acceptées, vous pouvez les remplacer par du fil. Il semble que la question initiale ne soit pas tout à fait correcte, mais la question initiale était en fait celle à laquelle je voulais obtenir une réponse, et j'ai trouvé une réponse, alors voici pour la postérité:

J'utilise la bibliothèque socket.io, et elle a component-emitter comme dépendance. Mais il a une paire de versions qu'il nécessite. Voici à quoi ressemblait le fichier yarn.lock avant de changer quoi que ce soit:

[email protected]:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"

[email protected]:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe"

Cela incluait donc deux copies de l'émetteur du composant dans mon code client. J'ai regardé, et il ne semblait pas y avoir de changement radical entre 1.1.2 et 1.2.0 (ou 1.2.1, ce qui était courant). J'ai d'abord essayé de changer le fichier yarn.lock:

[email protected], component-emitter@^1.2.1, [email protected]:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"

Cela a fonctionné, mais le fichier contient des avertissements indiquant qu'il est généré automatiquement, ce qui signifie que chaque mise à jour ou nouveau package ajouté ajoute des modifications. Un peu de recherche a trouvé le yarn --flat, qui obligera le fil à ne pas choisir plus d’un de chaque paquet dans l’ensemble du projet. Cela me semble exagéré, car je suis sûr qu'il existe des cas d'incompatibilité entre des paquets plus anciens et plus récents. Je voulais juste éliminer un paquet redondant de mon code client, pour réduire le téléchargement; Je veux toujours les packages de développement à tous travail correctement.

Mais dans les docs à fil - flat j'ai trouvé une référence à un bloc "résolutions" qui peut aller dans package.json:

"resolutions": {
  "package-a": "2.0.0",
  "package-b": "5.0.0",
  "package-c": "1.5.2"
}

Alors j'ai essayé de mettre "component-emitter" : "1.2.1" dans un nouveau bloc "résolutions" de mon package.json, et il a en fait réduit composant-emitter à 1.2.1 pour tous les emplacements qui le nécessitaient, et je ne dispose maintenant que d'une copie dans mon code client.

UPDATED EDIT: Fil maintenant, à partir de 1.0, supporte officiellement le bloc "résolutions" ci-dessus. Alors utilisez-le.

72
SomeCallMeTim

Ceci est maintenant possible avec le fil fonctionnalité de résolution de version sélective .

Dans votre projet package.json, utilisez resolutions:

  "resolutions": {
    "foobar/**/baz": "2.0.9"
  }

Cela annule la version de foobar du paquet baz (et de tous les autres paquetages en-dessous), forçant ainsi la version 2.0.9.

31
Tom Hale

@ SomeCallMeTime 's answer est excellent et nous le faisons depuis des mois au travail.

Malheureusement, cela n’est plus possible depuis la v0.24.x (voir cela comment ).

Il y a un PR sur Github ouvert avec une proposition RFC visant à avoir un moyen simple de gérer ce cas d'utilisation sans avoir à surveiller le fichier verrou généré.

3
maxime1992