<p>yarn probablemente no debería almacenar en caché los paquetes resueltos con una ruta de archivo</p>

Creado en 6 dic. 2016  ·  75Comentarios  ·  Fuente: yarnpkg/yarn

¿Quieres solicitar una función o informar de un error ?

Supongo que un _bug_.

¿Cuál es el comportamiento actual?
Si el comportamiento actual es un error, proporcione los pasos para reproducirlo.

Supongamos que tiene la siguiente estructura de proyecto:

component-foo/
└── package.json
└── index.js

yarn-test/
└── package.json

Con los siguientes archivos:

component-foo/package.json :

{
  "name": "component-foo",
  "version": "1.0.0",
  "private": true,
  "main": "index.js"
}

component-foo/index.js :

console.log('foo');

yarn-test/package.json :

{
  "name": "yarn-test",
  "version": "1.0.0",
  "private": true,
  "dependencies": {
    "component-foo": "file:../component-foo"
  }
}

Ahora ejecuta $ yarn install dentro de yarn-test/ y yarn-test/node_modules/component-foo/index.js es:

console.log('foo');

Ahora elimine yarn-test/node_modules/ y yarn-test/yarn.lock y cambie component-foo/index.js a esto:

console.log('bar');

Ahora ejecuta $ yarn install dentro de yarn-test/ nuevamente y yarn-test/node_modules/component-foo/index.js será:

console.log('foo');

Utiliza la versión en caché de component-foo , pero component-foo/index.js ha cambiado.

¿Cuál es el comportamiento esperado?

Esperaría que yarn-test/node_modules/component-foo/index.js debería ser esto al final:

console.log('bar');

Quizás los paquetes instalados con rutas locales como file:../ no deberían almacenarse en caché en absoluto, si no podemos averiguarlo, si han cambiado.

(FYI: parece que npm no los almacena en caché).

Por favor, mencione su versión de node.js, yarn y sistema operativo.

$ node -v
v6.9.1

$ yarn -V
0.18.0

macOS 10.12.1

Comentario más útil

@hantuzun ¿

Todos 75 comentarios

Esto también me engañó. Debe haber una forma de evitar esto sin borrar todo el caché.

Creo que existen tres formas de hacer que el hilo sea utilizable para este caso:

  1. La sugerencia de @donaldpipowitch de ignorar todas las dependencias locales.
  2. Reinstalar dependencias locales si un archivo allí se modifica más tarde que cuando se almacena en caché. Esto nos obligaría a conservar estos metadatos. Para las dependencias locales, podemos insertar líneas como esta en la columna "Resuelto": file://<path>@<cache_timestamp>
  3. Ignorando paquetes por nombre de paquete con comandos como yarn cache rm <package> y yarn cache add <package> . Para todas las dependencias.

Me gustaría que se implementara la segunda sugerencia. A menos que la tercera opción también podría ser útil para otros casos. Por ejemplo, yarn cache add <package> se puede usar para actualizar el caché de las dependencias ya almacenadas en caché en caso de que algo salga mal al descargar una dependencia.

@hantuzun ¿

@ satya164 tienes razón. Aunque, estoy más inclinado a que el tercer enfoque ayude si una dependencia de la red se modifica intencionalmente.

Algo como yarn cache ignore <package> será útil. Pero creo que no tienen por qué ser mutuamente excluyentes. Ignorar un paquete es útil, pero requiere trabajo manual. Las dependencias de archivos pueden funcionar sin ningún esfuerzo adicional si se ignoran de forma predeterminada.

¿Alguien puede explicarme la lógica interna?

Mi entendimiento:
Cuando se encuentra una dependencia con file: se activa file-resolver.js . Dice que la dependencia debe copiarse y no tiene hash . ¿No significa que no tener hash significa que ya no debería estar en caché ...? Pero el copy-fetcher.js parece establecer el hash en una cadena vacía en lugar de mantener null ... ¿Es este problema?

@bestander o @kittens ¿ Quizás podrías explicar esto un poco más ...? Me encantaría recibir un poco de ayuda para crear un PR ♥

Hash significa el hash md5 que se usa para tarball-fetcher, por ejemplo.
Luego, este hash se agrega al archivo yarn.lock para futuras verificaciones y también se agrega al nombre de la carpeta al guardar la carpeta descomprimida en la caché.
Estás cavando en la dirección correcta, gracias por investigar esto, un PR es muy bienvenido.
Probablemente pueda comenzar con un PR que agregue pruebas unitarias rotas

Probablemente pueda comenzar con un PR que agregue pruebas unitarias rotas

Bien, gracias por tu respuesta. ¿Debería hacer ping a usted como revisor en el PR o debería hacer ping a otra persona (oa nadie) ...?

Sí, hazme ping

@bestander probablemente este problema no debería resolverse ya que aún no se ha solucionado.

Sí, debería volver a abrirse. Se cerró porque escribí "arreglos # 2165" en el título de mi PR. Al principio pensé que sería un PR en curso, pero para solucionar este error queremos dos PR: el primero agregó una prueba unitaria (la afirmación que fallaría no está realmente activa, por lo que CI no explota) y el el segundo realmente lo arreglará.

Lo sentimos, github cierra los problemas cuando se fusionan las relaciones públicas

entonces, obviamente, esto sigue siendo un problema? es bastante molesto desarrollar con, para ser honesto. me está causando una pequeña interrupción a nivel personal en el trabajo, donde estoy haciendo uso de file: para crear un entorno de desarrollo modular. lo malo es que cada paquete local que edito (usando la ruta file: en package.json ), requiere hacer esto, para poder desplegar el contenido actualizado:

editar el contenido de mi paquete eslint-config-base-eslint

yarn cache clean && rm -rf node_modules/eslint-config-base-eslint && yarn install --force && yarn lint

Todos son bienvenidos a contribuir al proyecto.
Podría ser cualquier cosa: enviar una prueba de integración defectuosa para este caso, una solución o convencer a alguien para que trabaje en la solución.
Si desea conversar sobre la mejor manera de abordar eso, puede encontrar ayuda en el canal de discordia.

De hecho, creo que la solución debería ser de 10 a 15 líneas de código, probablemente ahorrará mucho tiempo solucionándolo antes

FYI: Podría ser que este problema también sea relevante para pasos lentos linking dependencies . Vea mi comentario aquí: https://github.com/yarnpkg/yarn/issues/1496#issuecomment -282688818.

Lo siento. No pude encontrar el tiempo para crear otro RP para este problema :( Estaba (y todavía estoy) muy ocupado.

@bestander Este es un gran bloqueador para mí, trabajar en un proyecto de varios módulos. Si estoy leyendo los enlaces y comentarios del código de @donaldpipowitch correctamente, ¿podríamos hacer que el solucionador de archivos cree un nuevo hash (en lugar de nulo) cada vez que intente resolverlo para forzar una reinstalación? ¿Di un UUID o una marca de tiempo actual? Perdóname si me falta algo, no estoy familiarizado con la forma en que funciona el código.

Un nuevo caché con una marca de tiempo y uuid suena como un truco razonable.
Idealmente deberíamos copiar los archivos directamente sin el caché, pero puede ser un
cambio más complejo.
Adelante, envía un PR

El martes 7 de marzo de 2017 a las 03:38, Matt Traynham [email protected] escribió:

@bestander https://github.com/bestander Este es un bloqueador bastante grande
para mí, trabajar en un proyecto de varios módulos. Si estoy leyendo @donaldpipowitch
Enlaces y comentarios del código de https://github.com/donaldpipowitch
correctamente, ¿podríamos hacer que el solucionador de archivos cree un nuevo hash (en lugar de
null) cada vez que intenta resolver, por lo que fuerza una reinstalación? Di un UUID
o marca de tiempo actual? Perdóname si me falta algo, no lo conozco
con la forma en que funciona el código.

-
Estás recibiendo esto porque te mencionaron.

Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/yarnpkg/yarn/issues/2165#issuecomment-284612526 , o silenciar
la amenaza
https://github.com/notifications/unsubscribe-auth/ACBdWDS3xSr8KNu1o9Zn8sA9xdO8pyHOks5rjNEmgaJpZM4LFbmf
.

@bestander Con respecto a su último comentario: ¿No tendría aún más sentido vincularlo simbólicamente, en lugar de copiar los archivos? ¿O hay alguna razón para no hacer eso?

@danrot windows parece requerir que el administrador
también se estropea recurriendo para encontrar módulos de nodo

Symlink también ignora .npmignore y cosas así. (Lo que actualmente también parece ignorarse. Lo que podría ser problemático: https://github.com/yarnpkg/yarn/issues/1496#issuecomment-282688818)

¿Existe alguna solución para esto que actualmente prohíbe borrar todo el caché? Desafortunadamente, parece que no hay yarn cache rm package comando de tipo

@ rhys-e uso este pequeño script:

#!/bin/sh
if [ $# != 1 ]
then
   echo Usage $0 package-name
   exit 1
else
    echo Reinstalling $1
fi

dir="node_modules/$1"

if [ -d $dir ]
then
    rm -fr $dir
fi

cache=`yarn cache dir`/npm-${1}*
#        echo $cache
rm -fr $cache && yarn install --force

¿Alguien ha intentado solo yarn link todas las dependencias locales en postinstall ? Parece una solución adecuada hasta que aterrice la solución adecuada.

Supongo que la idea es no tener que actualizar el número de versión del paquete en cada cambio para las dependencias locales. Un enlace de hilo te obligaría a hacer eso, ¿verdad? (no lo intenté)

Por mi parte, lo que finalmente hice fue invocar un script en la fase de preinstalación que compara lo que está en la carpeta de origen y la carpeta node_modules para las dependencias locales. Si detecta alguna diferencia, simplemente elimina la dependencia almacenada en caché y elimina el archivo de integridad (para forzar una reinstalación). Por lo tanto, cuando no hay cambios, la instalación de yarn es bastante rápida (no hay muchas dependencias locales) y, si hay, la versión en caché obsoleta no se usa.

El enlace

Probé diferentes combinaciones para solucionar los cambios en el paquete local que no se actualiza en la versión instalada de un proyecto principal en ./node_modules/. Encuentro que solo esto funcionaría, sin necesidad de eliminar el ./node_modules/primero:

yarn cache clean; yarn upgrade file:../<package>

No hace falta decir que no debería ser necesario forzar manualmente la limpieza de la caché global para actualizar / actualizar paquetes locales.

@fungilation Como solución alternativa, también puede usar npm para instalar dependencias locales y así evitar perder todo el caché cada vez que desee una actualización.

Según # 2860 y el posterior compromiso de fusión https://github.com/yarnpkg/yarn/commit/7241de13bb236526fa439a2528fbed319f60ef24 , ahora puede "actualizar" las dependencias del protocolo file: con

yarn install --force

Editar o actualizar el paquete en particular (no me di cuenta de que esto funcionaba tan bien). Si la versión de las dependencias no cambió, esto no modifica el archivo de bloqueo, pero seguirá copiando la versión más reciente.

yarn upgrade [file protocol package name]

El cambio de PR invalidará la dependencia en el caché y lo reinstalará localmente. yarn install también funcionará si la versión de las dependencias cambia, lo que invalida el archivo yarn.lock. Ya no es necesario borrar el caché ni eliminar el módulo de la instalación local.

También se me hizo evidente que hay un RFC activo para vincular dependencias, posiblemente con un protocolo link: . Eso se puede seguir aquí, https://github.com/yarnpkg/rfcs/pull/34.

@mtraynham ¡ Gracias por su solicitud de extracción! 👌 Esto es asombroso. ¿Alguna razón por la que se necesita --force ? Actualmente ni siquiera sé qué hace exactamente ahora mismo sin buscarlo :) Solo pregunto, porque npm no necesita una bandera --force y hubiera sido bueno comportarse como npm.

Editar Parece que yarn upgrade [dependency] funciona. Quiero señalar que esto no siempre cambia el archivo de bloqueo, que solo debería reflejar los cambios de versión de package.json. Actualicé mi publicación original, ya que una actualización probablemente sea más apropiada.


La versión corta es, Yarn no hará nada con los solucionadores de caché si el archivo de bloqueo no cambió, por lo que debemos omitir la verificación del archivo de bloqueo y preguntar al caché si hay una versión más nueva. Eso se puede hacer usando upgrade o install --force

Por yarn install --force documentación

"vuelve a recuperar todos los paquetes, incluso los que se instalaron previamente".

Esto realmente significa que omitirá la verificación de integridad del archivo de bloqueo. La verificación de integridad del archivo de bloqueo generalmente pasará si no cambia el archivo package.json y se rescata con gracia. Omitirlo le pide a la caché que verifique si hay dependencias faltantes / no coincidentes con el archivo de bloqueo, descargarlas si faltan y copiar localmente las dependencias más nuevas / faltantes. Luego ejecuta los scripts npm install / postInstall .

El cambio de PR ahora invalidará la dependencia file: en el caché y copiará la nueva versión localmente. Antes de esto, nunca invalidaría la dependencia file: . Para otros protocolos, si no cambió su archivo package.json, permanecerán sin cambios (en la caché y localmente).

¿Que significa esto para nosotros? Tengo alrededor de 60 dependencias en un proyecto (que van desde Angular hasta Webpack), con una dependencia file: . En un segundo install --force , donde solo quiero actualizar la dependencia local, toma alrededor de ~ 5 segundos (desde ~ 1,5 segundos para yarn install ). Para mí, esto es bastante insignificante, y de hecho estoy muy impresionado por el poco trabajo que el hilo intenta realizar durante todo el proceso.

Si hay otro comando CLI para omitir la verificación del archivo de bloqueo y verificar el caché solo para la dependencia del archivo en particular, eso probablemente sería aún más rápido, pero no he encontrado uno.


Dicho todo esto, todavía llamaría a esto una curita. Esto podría reemplazarse por una mejor solución como link: ; No creo que a nadie realmente le importe almacenar en caché las dependencias locales. Como mínimo, la sobrecarga adicional de usar install --force o upgrade es mayormente negligente y ya no tiene que yarn cache clean; mv node_modules /tmp/ .

Gran respuesta. 👏 Gracias por escribir esto.

¿Yarn sobrescribe los archivos de proyectos locales enlazados simbólicamente con archivos de la caché de yarn? (porque parece que eso es lo que está pasando)

El cambio de PR ahora invalidará el archivo: dependencia en el caché y copiará la nueva versión localmente.

¿Esto significa que cada vez que llamo a $ yarn dentro de un paquete que tiene "foo": "file:../" como dependencia, se creará una nueva copia de "file:../" ?

Por ejemplo, tengo un paquete con varios ejemplos que también son paquetes:

foo/
foo/examples/
foo/examples/example-1/
foo/examples/example-2/
foo/examples/example-3/
...
foo/examples/example-10/

Y parece que ahora tengo foo 10 veces en el caché de hilo. También pruebo mis ejemplos en cada cambio de versión de foo (y tengo varios módulos configurados de esa manera, no solo foo ) por lo que parece que mi caché de hilo crece _ realmente_ rápido actualmente.

¿Es este el comportamiento correcto?

Creo que es una mejor alternativa que tener una versión obsoleta en tu caché.
Con yarn 0.26 puedes usar link: para crear enlaces simbólicos en lugar de copiar archivos.
También estamos trabajando en espacios de trabajo que automatizarán la creación de enlaces simbólicos, https://github.com/yarnpkg/yarn/issues/3294

Sí, deseando espacios de trabajo 👍

link: aún no funciona con npm, ¿verdad? (Porque https://github.com/npm/npm/pull/15900 todavía está abierto).

Desde la nota de parche npm 5 , los archivos ahora se file: :

npm install ./packages/subdir ahora creará un enlace simbólico en lugar de una instalación normal. file: //path/to/tarball.tgz no cambiará, solo los directorios tienen enlaces simbólicos. (# 15900)

Así que sí, no hay link con npm.

npm install ./packages/subdir ahora creará un enlace simbólico en lugar de una instalación normal

Un poco desafortunado. Los departamentos de archivo nunca se comportaron de la misma manera debido a que copiaron todo (incluido node_modules ) y no respetaron el campo .npmignore o files . Ahora es peor con el enlace simbólico.

Creo que el archivo: y el enlace: podrían mejorarse aún más, hay diferentes estrategias que tienen sus propios PRO y CON, y Yarn debería permitir que la gente elija uno.
Por ejemplo, knit RFC podría implementarse como una de las estrategias https://github.com/yarnpkg/rfcs/blob/master/accepted/0000-yarn-knit.md

@bestander

Creo que es una mejor alternativa que tener una versión obsoleta en tu caché.

O eso creerá hasta que se quede sin espacio en disco y descubra que su caché de Yarn está usando decenas de gigabytes para millones de archivos completamente inútiles .
En mi opinión, eso hace que todo se rompa más seriamente de lo que estaba antes, porque solo lo averigua una vez que ha roto temporalmente su sistema de desarrollo.

Hola chicos, ¿alguna actualización sobre el tema? Es realmente un gran problema para nosotros, especialmente cuando trabajamos en varios productos a la vez que dependen de las mismas dependencias múltiples vinculadas. Gigabytes de caché en un día de desarrollo, etc. ¿Podría al menos hacerlo opcional y deshabilitar el almacenamiento en caché para dichos paquetes?

@nikdojo Usa el link: para las dependencias en lugar de file: , usa enlaces simbólicos. Fue introducido en 0.26 .

Alternativamente, comience a usar espacios de trabajo si tiene muchas dependencias entre proyectos.

@mtraynham Thx por la pista, intenté encontrar información sobre el protocolo link: en los documentos oficiales, pero parece que no está allí. Experimentando con espacios de trabajo ahora.

@bestander por cierto, como saben, react-native no admite enlaces simbólicos, así que si trabajamos con rn libs, sigue siendo un gran problema.

Esto nunca se resolvió, ¿verdad? Debe usar linklocal (paquetes NPM) para vincular paquetes locales (que debería ser la forma estándar en que opera yarn al consumir paquetes del sistema de archivos local, usando uniones o enlaces simbólicos en Windows en lugar de almacenar en caché). Un nuevo yarn install luego sobrescribe todo con cosas viejas de la caché y tienes que comenzar de nuevo a vincular.

¿Podemos ser menos astronautas de la arquitectura y simplemente no almacenar en caché los paquetes locales? Este problema tiene ahora 1,5 años y estoy cansado de correr yarn add ../<another-local-package> cada vez que cambio algo en another-local-package .

Hola @fungilation
Abrí otro problema relacionado: # 6037

no funciona
He puesto en el archivo App.js
console.log ('aquí estamos'), y no salió.
luego elimine todos los archivos y aún genera la salida del caché.
¿Cómo evitarlo?

Yarn realmente me ha fallado en este tema. Ha sido genial para todo lo demás, excepto para esto.

He intentado instalar una nueva versión de un paquete local con fines de prueba y sigo terminando con el paquete anterior sin importar lo que haga.

He intentado:

  1. Limpiar el caché de hilo ( yarn cache clean package-name )
  2. yarn add 'ing con --force
  3. Eliminando node_modules/package-name y yarn add ing de nuevo
  4. Actualizar el número de versión y el nombre de archivo del paquete local ( yarn aún instala el contenido de la versión anterior , aunque informa haber instalado la más nueva)
  5. Combinaciones de todo lo anterior

Esto es ridículo y he pasado casi 4 horas de mi día en esto.

Necesitamos la capacidad de desarrollar y reinstalar paquetes locales . Estoy confiando en hilo para instalar un archivo en la carpeta .bin, por lo que yarn link está fuera de discusión.

@ Desarrolladores de Yarn: ¿Puede instalar un paquete local, realizar cambios en ese paquete local y luego hacer que los cambios se reflejen instalando nuevamente?

@gregjacobs Tuve éxito con yarn install --force

@jonathantorley Lo intenté de nuevo con --force y todavía no funciona con el hilo 1.12.3

Para otros que enfrentan este problema: una solución alternativa que utilicé para que esto funcionara fue aumentar el número de versión del paquete dependiente. Un poco molesto, y debe recordar hacerlo en cada cambio (a menos que pueda escribirlo).

yarn definitivamente no debería requerir esta solución al instalar paquetes locales

Agregué yarn upgrade MY_PACKAGE_NAME en el script preinstall , y se actualiza bien a la última versión de NPM. (Aún así, necesito aumentar la versión NPM manualmente).

Parece que yarn add file:PATH ahora siempre actualiza el nuevo contenido ahora en yarn 1.13.0.
yarn install todavía no.

@leavesster Todavía no lo hace para mí.

Tengo que cambiar el nombre del tgz para que se actualice

Intente usar el comando link : https://yarnpkg.com/lang/en/docs/cli/link/

yarn add file:PATH no actualizó el nuevo contenido por mí. Además, los archivos de package.json y .npmignore no se respetan.

Funciona si cambia la versión de su paquete.

Si desea que yarn add file:PATH respete los archivos en package.json y .npmignore, debe ejecutar yarn pack en la dependencia de su paquete local y luego, donde desee instalarlo, ejecute yarn add file:path-to-local-pacckage.tgz

Intente usar el comando link : https://yarnpkg.com/lang/en/docs/cli/link/

yarn link no pretende responder al mismo problema. No es bueno si alguien quiere el paquete npm como si fuera publicado respetando los archivos en package.json y .npmignore

@leavesster Todavía no lo hace para mí.

Tengo que cambiar el nombre del tgz para que se actualice

No tengo ningún tgz en mi paquete que utilizo yarn add file: PACKAGE_PAH para agregarlo en el proyecto actual. Solo tengo el código js en mi paquete. ¿Quizás tgz todavía está mal?

No funciona para mi tampoco

@bestander ¿

Tengo el mismo problema que @gregjacobs. yarn cache clean package no ayudó. Pero me di cuenta de que si instala yarn add path/to/package.tgz y luego reemplaza el archivo por otro, puede instalar una nueva versión simplemente cambie la ruta como yarn add path/to/../to/package.tgz , por lo que la ruta absoluta es la misma, pero para el hilo es diferente .

No entiendo en qué otro lugar almacenan los paquetes en caché por ruta de resolución, incluso yarn cache list --pattern package está vacío.

Creo que el problema está en algún lugar aquí https://github.com/yarnpkg/yarn/blob/eb2b565bb9b948e87b11119482ebc184a9d66141/src/resolvers/exotics/tarball-resolver.js#L58 -L63

Qué esta pasando:

  • Desde la url path/to/package.tgz genera hash (es por eso que path/to/package.tgz y path/to/../to/package.tgz resultados a diferentes hash)
  • Con ese hash crea un directorio temporal para el paquete (como este /Users/kich/Library/Caches/Yarn/v4/.tmp/c019816ee7d10ed5e1fef4072e8cc617 )
  • Para la primera ejecución isValidModuleDest return false y todo va bien
  • Paquetes de Tarball extraídos en este directorio
  • Archivos de ese directorio instalados en el proyecto
  • Modifica las fuentes de desarrollo del proyecto y crea / empaqueta el nuevo paquete tarball con el mismo nombre y ubicación que el anterior
  • E intenta instalar un nuevo tarball, pero el hash generado es el mismo que antes y el directorio temporal no se borró después de la primera ejecución
  • Entonces en este tiempo isValidModuleDest return true
  • E hilo instala la versión anterior de tu paquete
  • Ejecuta yarn cache clean package , pero el directorio temporal permanece intacto

@bestander, ¿podemos simplemente eliminar el directorio temporal aquí https://github.com/yarnpkg/yarn/blob/master/src/config.js#L431 ?

Frente al mismo problema, el caché en la carpeta temporal toma 10 GB después de que trabajo en mi paquete local por solo un día.

¿Podemos reabrir este problema? Nos enfrentamos al mismo problema. Dos proyectos que hacen referencia a otro paquete a través de un archivo:. Después de algunas compilaciones en nuestro servidor CI / CD, la carpeta de caché comienza a ocupar mucho espacio.

Creo que el protocolo de enlace es la mejor solución para esto, file: // no funciona ya que aún requiere limpiar cachés manualmente y forzar la instalación

https://github.com/yarnpkg/yarn/issues/2165#issuecomment -345825904

solo haz que tu dependencia sea algo como esto

"<package>": "link:./libs/<package>"

@alxtz ¿el protocolo de enlaces funciona con paquetes en tgz?

Creo que el protocolo de enlace es la mejor solución para esto, file: // no funciona ya que aún requiere limpiar cachés manualmente y forzar la instalación

# 2165 (comentario)

solo haz que tu dependencia sea algo como esto

"<package>": "link:./libs/<package>"

Gracias por esto, esto replica el comportamiento de NPM que enlazará file:.. referencias en node_modules . No parece estar documentado, al menos no aquí donde esperaría encontrarlo: https://yarnpkg.com/lang/en/docs/package-json/

Lamentablemente, link no se puede usar en todos los casos.

Por ejemplo, necesito una dependencia compartida / entre pares de mi paquete SDK, que cuando hago cambios, lo vincularía para el trabajo de desarrollo local.
Con link , yarn no se da cuenta de que la dependencia es una dependencia compartida / entre pares y usa el paquete local donde está el enlace simbólico, lo cual es incorrecto.

He estado usando yarn pack junto con yarn add file:<path_to_packed_tgz> para solucionar esto.
Si bien puedo continuar cambiando el nombre del paquete cada vez que lo empaque y lo pego en mi repositorio, para no generar el mismo hash, según el @wKich , es muy molesto.

Bifuré el repositorio y puse una cláusula adicional en la declaración if para evitar que el hilo cargue un paquete .tgz local desde su caché si se especifica usando yarn add file:<path> .

const dest = this.config.getTemp(crypto.hash(url));
// If specified using file: never load from cache
if (!url.match(/file:/) && (await this.config.isValidModuleDest(dest))) {
  // load from local cache
} else {
  // continue as if it's a new package
}

Puedo hacer un PR si la gente lo quiere, aunque nunca lo había hecho antes y es una solución bastante peligrosa.
¿Podría alguien confirmar si este enfoque continuaría agregando los paquetes locales al caché de yarn o no, por favor?

@ojboj por ahora, yalc podría ayudar hasta que esto se solucione adecuadamente. Me ha funcionado muy bien probar paquetes localmente antes de publicarlos.

@souporserious Eso es exactamente lo que necesitaba / quería, ¡muchas gracias!

Una locura, esto sigue siendo un problema después de tantos años.

¿Está fijo en [email protected]?

@wKich ¡ protocolo del portal .

Sigo recibiendo el error "desempaquetar en el mismo destino" usando el protocolo link: , y hace referencia a mi directorio de caché, por lo que me parece que yarn todavía está almacenando en caché las dependencias de link: . Estoy haciendo referencia a 2 copias del mismo paquete local, copiado en la carpeta .deps/ de cada aplicación que lo usa - front-end y renderer en el siguiente error. (No se puede vincular al original por motivos no relacionados)

warning Pattern ["@horizon/common<strong i="11">@link</strong>:packages/front-end/.deps/@horizon/common"] is trying to unpack in the same destination "/home/garyo/.cache/yarn/v6/[email protected]/node_modules/@horizon/common" as pattern ["@horizon/common<strong i="12">@link</strong>:packages/renderer/.deps/@horizon/common"]. This could result in non-deterministic behavior, skipping.
¿Fue útil esta página
0 / 5 - 0 calificaciones