node.js - usando - ¿Cómo anulo las dependencias anidadas con `yarn`?
node js rest api mysql (3)
Si mi paquete tiene estas dependencias
{ "name": "my-package",
"dependencies": { "foobar":"~1.0.3", "baz":"2.0.9" }
Y el paquete
foobar
tiene estas dependencias
{ "name": "foobar",
"dependencies": { "baz":"^2.0.0" }
y la versión lanzada más recientemente de
baz
es
2.1.0
, la primera ejecución de
yarn
instalará
[email protected]
en
foobar/node_modules
.
¿Cómo
[email protected]
a la lana a usar el paquete
[email protected]
para
foobar
?
Tengo entendido que esto sería posible usando
npm shrinkwrap
(a la
pregunta
).
El resumen de mi pregunta probablemente sea: Yarn crea instalaciones repetibles y deterministas, pero ¿cómo personalizo esa instalación?
Esto ahora es posible con la función de resolución de versión selectiva de hilo.
En el
package.json
su proyecto, use
resolutions
:
"resolutions": {
"foobar/**/baz": "2.0.9"
}
Esto anula la versión de
baz
del paquete
foobar
(y cualquier otro paquete debajo de él), forzándolo a ser la versión 2.0.9.
La answer es excelente y lo hemos estado haciendo durante un mes en el trabajo.
Desafortunadamente, esto ya no es posible desde la v0.24.x (ver ese comment ).
Hay un PR abierto en Github con una propuesta de RFC para tener una forma simple de manejar ese caso de uso sin tener que vigilar el archivo de bloqueo generado.
Si, de hecho, tiene una subdependencia que es demasiado restrictiva en las versiones que aceptará, puede anularlas con hilo. Parece que la pregunta original no era exactamente correcta, pero la pregunta original era de hecho la que quería que respondiera, y encontré una respuesta, así que aquí está para la posteridad:
Estoy usando la biblioteca socket.io, y tiene un
component-emitter
como dependencia.
Pero tiene un par de versiones que requiere.
Así es como se veía el archivo yarn.lock antes de cambiar algo:
[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"
Por lo tanto, incluía dos copias del emisor del componente en mi código de cliente. Miré, y no parecía haber ningún cambio importante entre 1.1.2 y 1.2.0 (o 1.2.1, que era actual). Primero probé simplemente cambiando el archivo 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"
Esto funcionó, pero el archivo tiene advertencias sobre su autogeneración, lo que significa que cada actualización o paquete nuevo que agregue pisoteará este cambio.
Un poco de búsqueda encontró la opción de
yarn --flat
, que obligará al hilo a elegir no más de uno de cada paquete en todo el proyecto.
Eso me parece excesivo, ya que estoy seguro de que hay casos reales de incompatibilidad entre los paquetes más antiguos y los más nuevos.
Solo quería eliminar un paquete redundante de mi código de cliente, para hacer la descarga más pequeña;
Todavía quiero que los paquetes de desarrollo
funcionen
correctamente.
Pero en los documentos para hilar --flat encontré una referencia a un bloque de "resoluciones" que puede ir en package.json:
"resolutions": {
"package-a": "2.0.0",
"package-b": "5.0.0",
"package-c": "1.5.2"
}
Así que traté de poner
"component-emitter" : "1.2.1"
en un nuevo bloque de "resoluciones" en mi package.json, y de hecho aplanó el componente-emisor a 1.2.1 para todos los lugares que lo requerían, y ahora tener solo una copia en mi código de cliente.
EDICIÓN ACTUALIZADA: Yarn ahora, a partir de 1.0, admite oficialmente el bloque de "resoluciones" anterior. Así que solo usa eso.