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.


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.


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


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

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.


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.