Dependencia local en package.json

453

Quiero hacer algo como esto, por lo que npm installtambién instala el package.jsonde ../somelocallibo más importante sus dependencias.

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}
usuario1680104
fuente

Respuestas:

583

npm> = 2.0.0

Esta característica se implementó en la versión 2.0.0 de npm. 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

El paquete local se copiará al prefijo ( ./node-modules).

npm <2.0.0

Pon somelocallibcomo dependencia en tu package.jsoncomo de costumbre:

"dependencies": {
  "somelocallib": "0.0.x"
}

Entonces corre npm link ../somelocallib y npm instalará la versión en la que estás trabajando como un enlace simbólico .

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

Referencia: enlace (1)

danilopopeye
fuente
3
¿Cómo podemos desvincularlo?
AtaurRehman Asad
13
La desventaja de instalar paquetes locales con "enlace npm" es que obtienes mucha duplicación de módulos. Cuando enumera sus dependencias con "module: version" o "module: git-repo", el algoritmo de instalación npm evita instalar un paquete que ya está instalado en un paquete padre. Entonces, con "npm link", si su aplicación principal depende de "[email protected]" y todos sus paquetes locales también dependen de "[email protected]", terminará con todos los paquetes locales instalando "[email protected]". 0 "en lugar de utilizar la misma versión" asíncrona "instalada de la aplicación principal. Esto no sucede usando la "carpeta de instalación npm".
Pedro Ballesteros
3
@PedroBallesteros puede usar el npm deduppara solucionar este problema. npmjs.org/doc/cli/npm-dedupe.html
danilopopeye
44
"El paquete local se copiará ..." no parece ser el caso con una versión npm más reciente. Ahora, se crea un enlace simbólico.
tsauerwein
2
@danilopopeye Por docs.npmjs.com/cli/install la npm install <folder> descripción dice Instalar el paquete en el directorio como un enlace simbólico en el proyecto actual.
Herman J. Radtke III
211

Ahora es posible especificar rutas de instalación del módulo de nodo local en su package.jsondirectamente. De los documentos:

Caminos locales

A partir de la versión 2.0.0, puede proporcionar una ruta a un directorio local que contenga un paquete. Las rutas locales se pueden guardar usando npm install -So npm install --save, usando cualquiera de estos formularios:

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

en cuyo caso se normalizarán a una ruta relativa y se agregarán a su package.json. Por ejemplo:

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

Esta característica es útil para el desarrollo local fuera de línea y la creación de pruebas que requieren la instalación de npm donde no desea acceder a un servidor externo, pero no debe usarse al publicar paquetes en el registro público.

Michael Trouw
fuente
23
En npm v.3 +, la normalización es absoluta, no relativa , por lo que verá algo como"bar": "file:///home/user/src/foo/bar"
Ron Wertlen
27
¿Cómo actualizar la dependencia de la ruta local sin incrementar la versión?
Bohdan Lyzanets
3
Por cierto, esto causa todo tipo de problemas cuando y / o si intentas acoplar tu aplicación de nodo, ya que las node:onbuildimágenes estándar solo copian el directorio actual y, por lo tanto, omiten cualquier cosa ../foo.
donmartin
44
¿Hay alguna forma de integrar esto con git + ssh para que uno pueda tener una copia local del repositorio git del que npm installprovienen u otro repositorio git en la LAN? Cuando intento la instalación anterior y npm desde git + ssh, parece que se ve en el directorio node_modules y no intento pasar por git + ssh, aunque así es como estoy instalando el paquete de nivel superior.
Michael
1
Instalación de trabajo. Pero de esta manera obtendré "ERR no encontrado" cuando intente importar el módulo a mi proyecto.
C4d
87

Esto funciona para mi.

Coloque lo siguiente en su archivo package.json

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}
Brian McAuliffe
fuente
44
Gracias por la sugerencia que no requiere el uso de "enlace npm"
ItalyPaleAle
Se eliminó .gitignoreen la carpeta del módulo, se creó .npmignorey la primera vez que lo ejecuté aplicó 777 recursivamente en todas las carpetas excepto node_modules. Pero sí, instaló las dependencias. Usando npm versión 1.4.14.
L0LN1NJ4
usé esto, pero en lugar de jugar con node_modules, usé app_modules
catalint
1
¿Por qué no "dependencies": { "my-own-module": "file:../my-own-module" }?
Bohdan Lyzanets
1
Estoy de acuerdo con @Bohdan aquí. las dependencias locales harán exactamente lo mismo. La ventaja de usar npm linkes que no necesita hacerlo npm installcada vez para actualizar sus dependencias.
froginvasion
30

Si desea automatizar aún más esto, porque está revisando su módulo en el control de versiones y no quiere confiar en que los desarrolladores recuerden el enlace npm, puede agregar esto a la sección de "scripts" de package.json:

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

Esto se siente más allá de hacky, pero parece "funcionar". Recibí el consejo de este problema de npm: https://github.com/npm/npm/issues/1558#issuecomment-12444454

Taytay
fuente
15
¿Por qué postinstally en postupdatelugar de preinstally preupdate?
derecha el
1
¿Podría explicar un poco más lo que esto hace? es decir, si configuro un proyecto vscode con múltiples carpetas raíz (es decir, "espacio de trabajo de múltiples raíces"), ¿será capaz de reflejar los cambios en la carpeta del módulo inmediatamente para los proyectos consumidores? - ¿De eso se trata este truco?
bvdb
26

Así es como agregará dependencias locales:

npm install file:src/assets/js/FILE_NAME

Agréguelo a package.json desde NPM:

npm install --save file:src/assets/js/FILE_NAME

Agregue directamente a package.json así:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....
sreekanth
fuente
6

Proyecto maestro

Aquí está el package.json que usará para el proyecto maestro:

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

Ahí ./somelocallibestá la referencia a la carpeta de la biblioteca en relación con el proyecto maestro package.json .

Referencia: https://docs.npmjs.com/files/package.json#local-paths


Subproyecto

Maneja las dependencias de tu biblioteca.

Además de correr npm install, deberás correr(cd node_modules/somelocallib && npm install) .

Este es un error conocido con NPM.

Referencia: https://github.com/npm/npm/issues/1341 (buscando una referencia más actualizada)


Notas para Docker

Revisa tu maestro package.locky tusomelocallib/package.lock administrador de código fuente.

Luego, en su Dockerfile use:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

Utilizo paréntesis en mis (cd A && B)construcciones para hacer que la operación sea idempotente.

William Entriken
fuente
3

Sé que eso npm install ../somelocallibfunciona.

Sin embargo, no sé si la sintaxis que muestra en la pregunta funcionará o no package.json...

Desafortunadamente, el documento parece mencionar solo la URL como una dependencia.

Intente file:///.../...tar.gz, señalando una lib local comprimida ... y díganos si funciona.

HOLA
fuente
1
Agrego "dependencias": {"somemodule": "file: ///./internal_modules/somemodule"} a package.json. No funciona El código de error es "npm ERR! Code E404".
Jeffrey
2

Esto funcionó para mí: primero, asegúrese de que los directorios npm tengan el usuario correcto

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

Entonces su en su package.json enlace el directorio

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}
Sofía
fuente
2
Los enlaces simbólicos en Windows son posibles desde XP en.wikipedia.org/wiki/NTFS_symbolic_link . Abra la línea de comando como administrador, luego ejecute npm install.
sod
2

En realidad, a partir de npm 2.0, ahora hay soporte para rutas locales (ver aquí ).

damirv
fuente
8
Michael Trouw ya dio esta respuesta unas semanas antes, entonces, ¿por qué duplicar?
Dan Dascalescu
2

Curioso ... al menos en Windows (mi npm es 3.algo) que necesitaba hacer:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

Cuando hice un npm install ../module1 --saveresultado resultó en rutas absolutas y no relativas según la documentación.

Jugueteé un poco más y determiné que ../xxxera suficiente.

Específicamente, compruebo los módulos de nodo local para decir d: \ build \ module1, d: \ build \ module2 y mi proyecto de nodo (aplicación) en d: \ build \ nodeApp.

Para 'instalar', yo:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

package.json del módulo1 tiene una dependencia de "module2": "../module2"; module2 no tiene dependencia local; nodeApp tiene dependencias "module1": "../module1" y "module2": "../module2".

No estoy seguro de si esto solo funciona para mí, ya que las 3 carpetas (módulo1, módulo2 y nodeApp) se encuentran en ese mismo nivel .......

Paul Duncan
fuente