Cómo especificar módulos locales como dependencias del paquete npm

269

Tengo una aplicación que tiene el conjunto habitual de dependencias en módulos de terceros (por ejemplo, 'express') especificado en el archivo package.json bajo dependencias. P.ej

"express"     : "3.1.1"

Me gustaría estructurar mi propio código de forma modular y que el paquete.json instale un conjunto de módulos locales (es decir, en el sistema de archivos en el que estoy actualmente). Sé que puedo instalar un módulo local ejecutando:

npm install path/to/mymodule

Sin embargo, no sé cómo hacer que esto suceda a través de la estructura de dependencias package.json. Usar la --saveopción en este comando es simplemente ponerlo "mymodule": "0.0.0"en mi paquete.json (no hace referencia a la ubicación de la ruta del archivo). Si luego elimino la versión instalada de node_modules e intento reinstalarla desde el package.json, falla (porque busca "mymodule" en el registro central y no se ve localmente).

Estoy seguro de que es una forma de decirle a la "dependencies": {}estructura que quiero que se instale desde una ruta del sistema de archivos, pero no sé cómo.

¿Alguien más ha tenido este problema? Gracias.

Sam Adams
fuente
1
Una muy buena pregunta. Es triste darse cuenta de que no hay una característica equivalente package.jsona lo que tenemos en Gemfiles.
Jarl
3
posible duplicado de dependencia local en package.json
Kelly

Respuestas:

408

npm install ahora es compatible con esto

npm install --save ../path/to/mymodule

Para que esto funcione mymoduledebe configurarse como un módulo propio package.json. Consulte Creación de módulos NodeJS .

A partir de npm 2.0, las dependencias locales son compatibles de forma nativa. Ver la respuesta de danilopopeye a una pregunta similar . He copiado su respuesta aquí, ya que esta pregunta ocupa un lugar muy alto en los resultados de búsqueda web.

Esta característica se implementó en la versión 2.0.0 de npm. Por ejemplo:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Cualquiera de las siguientes rutas también es válida:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

sincronización de actualizaciones

Dado que las npm installcopias mymoduleen node_modules, los cambios en mymodulela fuente no serán vistos automáticamente por el proyecto dependiente.

Hay dos formas de actualizar el proyecto dependiente con

  • Actualice la versión mymoduley luego usenpm update : Como puede ver arriba, la package.jsonentrada "dependencias" no incluye un especificador de versión como vería para las dependencias normales. En cambio, para las dependencias locales, npm updatesolo intenta asegurarse de que esté instalada la última versión, según lo determinado por mymodule's package.json. Vea la respuesta de chriskelly a este problema específico .

  • Vuelva a instalar usando npm install. Esto instalará lo que esté en mymodulela ruta de origen de la fuente, incluso si es más antiguo o tiene una rama alternativa desprotegida, lo que sea.

Randy the Dev
fuente
2
Esto funcionó para mí. (Acabo de hacer un camino relativo local como"mymodule":"file:mymoduledir"
Don Rhummy
72
npm install --save ../my-local-repo
Ivan Rave
15
¿Y cómo usarlo en el proyecto? Estoy tratando de llamarlo así import { HelloWorld } from "my-test-lib";, pero recibo el error "No se puede encontrar el módulo". Por favor, eche un vistazo a stackoverflow.com/questions/46818083/…
Vitalii Vasylenko el
66
@LucioMollinedo, ¿puede compartir la sintaxis de cómo importó el módulo local? Al igual que con Vitallii, recibo el error "No se puede ajustar el módulo" conimport { HelloWorld } from "my-test-lib";
Stan James
77
Esto no funciona igual que hacer referencia a un paquete ya que las dependencias no se instalarán en el proyecto
Glass Cannon
44

Ver: dependencia local en package.json

Parece que la respuesta es npm link: https://docs.npmjs.com/cli/link

Jasoncrawford
fuente
55
en realidad, el enlace npm solo creará los enlaces simbólicos, y no modificará el package.json para agregar la dependencia local
Sebastien H.
1
Pero si no es symlinkasí, ¿cómo sabrá el proyecto padre reconstruir una vez que la dependencia haya terminado de construirse?
Jamie Hutber
11

No pude encontrar una manera ordenada al final, así que fui a crear un directorio llamado local_modulesy luego agregué este bashscript al package.json en scripts-> preinstall

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done
Sam Adams
fuente
5

Después de luchar mucho con el npm linkcomando (solución sugerida para desarrollar módulos locales sin publicarlos en un registro o mantener una copia separada en la carpeta node_modules), construí un pequeño módulo npm para ayudar con este problema.

La solución requiere dos pasos sencillos .

Primero:

npm install lib-manager --save-dev

Segundo, agregue esto a su package.json:

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}

Más detalles en https://www.npmjs.com/package/lib-manager . Espero que ayude a alguien.

Anurag Dutta
fuente
0

Si es aceptable simplemente publicar sus módulos preinstalados en node_modules junto con sus otros archivos, puede hacerlo así:

// ./node_modules/foo/package.json
{ 
  "name":"foo",
  "version":"0.0.1",
  "main":"index.js"
}

// ./package.json
...
"dependencies": {
  "foo":"0.0.1",
  "bar":"*"
}

// ./app.js
var foo = require('foo');

También es posible que desee almacenar su módulo en git y decirle a su paquete principal.json que instale la dependencia de git: https://npmjs.org/doc/json.html#Git-URLs-as-Dependencies

Platón
fuente
55
Desafortunadamente, eso implicaría que node_modules tengan mis módulos locales y módulos de terceros / contribuidos instalados desde el registro (por ejemplo, connect) en el mismo directorio. Además de ser confuso desde una perspectiva Git / VCS (es decir, tendría que ignorar todo en node_modules excepto los que creé), también es una mala práctica (aquellos que he escrito y no publicado deben mantenerse separados de los otros que han escrito y publicado )
Sam Adams
Cuando agrego un módulo local y hago cambios, mi aplicación principal no los ve. ¿Por qué es este el caso?
Mark Tyers