119 votes

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

Si mon colis a ces dépendances

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

Et l' foobar paquet a ces dépendances

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

et le plus récemment publié la version d' baz est 2.1.0, de la première exécution d' yarn installera baz@2.1.0 en foobar/node_modules.

Comment puis-je forcer fils à l'utilisation de l' baz@2.0.9 package pour foobar?

Ma compréhension est que ce serait possible à l'aide d' npm shrinkwrap (à la cette question).


Le résumé de ma question est: Fils crée reproductible, déterministe, les installations, mais comment puis-je personnaliser l'installation?

167voto

SomeCallMeTim Points 1803

Si vous avez un sous-dépendance qui est trop restrictive dans quelles versions il accepte, vous pouvez les remplacer à l'aide de fils. Il semble que la question d'origine n'était pas tout à fait correcte, mais la question d'origine était en fait celui que je voulais répondu, et j'ai trouvé une réponse, si elle est ici pour la postérité:

Je suis l'aide de la douille.io bibliothèque, et il a component-emitter comme une dépendance. Mais il a une paire de versions qu'il exige. C'est ce que le fils.fichier de verrouillage ressemblait avant j'ai changé quoi que ce soit:

component-emitter@1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"

component-emitter@1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe"

Il était donc dont deux copies du composant émetteur dans mon code client. J'ai regardé, et il ne semblait pas du tout la rupture des changements entre 1.1.2 et 1.2.0 (ou 1.2.1, qui a été en cours). J'ai d'abord essayé en changeant simplement le fil.fichier de verrouillage:

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

Cela a fonctionné, mais le fichier a des avertissements à ce sujet étant générée automatiquement, ce qui signifie que chaque mise à jour ou un nouveau forfait, je m'ajoutez stomp sur ce changement. Un peu de recherche trouvé l' yarn --flat option, qui va forcer fils à ne pas choisir plus d'un de chaque colis de l'ensemble du projet. Qui semble exagéré pour moi, car je suis sûr que il y a des cas d'incompatibilité entre les anciens et les nouveaux paquets. Je voulais juste éliminer une redondant package à partir de mon code client, pour rendre le téléchargement plus petits; je veux encore les paquets de développement à tous de travailler correctement.

Mais dans les docs de fil --plat , j'ai trouvé une référence à un "résolutions" bloc qui peut aller dans le paquet.json:

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

J'ai donc essayé de mettre "component-emitter" : "1.2.1" dans un nouveau "résolutions" bloc dans mon colis.json, et il en fait aplati composante de l'émetteur pour 1.2.1 pour tous les endroits qui en ont besoin, et maintenant j'ai qu'une seule copie dans mon code client.

Mise à JOUR EDIT: Fil maintenant, en tant que de 1,0, prend officiellement en charge les "résolutions" bloc ci-dessus. Donc, juste l'utiliser.

71voto

Tom Hale Points 5950

Ceci est maintenant possible avec la fonction de résolution de version sélective du fil.

Dans les package.json votre projet, utilisez resolutions :

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

Cela annule la version de foobar paquet baz (et de tous les autres paquets en dessous), le forçant à passer à la version 2.0.9.

1voto

Maxime Points 1054

@SomeCallMeTime's réponse est grande et nous l'avons fait que pour le mois au travail.

Malheureusement, ce n'est plus possible depuis la v0.24.x (voir commentaire).

Il y a un ouvert de RP sur Github avec un RFC proposition d'une manière simple de gérer ce cas d'utilisation sans avoir à garder un oeil sur le fichier de verrouillage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X