¿Instalar un módulo local usando npm?

Respuestas:

481

De la documentación de npm-link :

En el directorio del módulo local:

$ cd ./package-dir
$ npm link

En el directorio del proyecto para usar el módulo:

$ cd ./project-dir
$ npm link package-name

O de una vez usando rutas relativas:

$ cd ./project-dir
$ npm link ../package-dir

Esto es equivalente a usar dos comandos anteriores debajo del capó.

Rich Apodaca
fuente
14
Este es el único enfoque de aspecto sensato que he visto hasta ahora: por qué npm tiene que ser tan oscuro / obtuso w. en lo que respecta a crear un paquete local, instalarlo y luego usarlo, no lo sé ... el enlace funciona (y es genial), pero la terminología es bastante confusa.
smaudet
66
@Rich Apodaca, gracias por el enlace doc. No menciona deshacer el proceso. Parece que todo lo que hace es crear enlaces simbólicos, ¿así que puedo eliminarlos normalmente?
Tyler Collier el
1
@TylerCollier npm unlink parece ser la operación de imagen espejo stackoverflow.com/a/24940024/54426
Rich Apodaca
1
Solo una nota, si usa Angular2 (¿o tal vez otras aplicaciones?), Hay algunos rumores sobre la vinculación npm que es la causa raíz de un tipo específico de problema. Ejemplo aquí y aquí
The Red Pea
44
Sin embargo, tenga en cuenta que npm linkcreará una segunda instancia de dependencias externas. Entonces, si tiene un paquete A necesita B y C, B necesita C. vincular B hará que la aplicación A tenga dos instancias de C.
user2167582
422

solo debe proporcionar un <folder>argumento npm install, el argumento debe apuntar hacia la carpeta local en lugar del nombre del paquete:

npm install /path
lujoso
fuente
55
A diferencia del enlace, este usa .npmignore.
Camille Wintz
30
@bithavoc Al menos a partir de npm 5, la instalación de una carpeta ahora crea un enlace simbólico, no una copia. Ver docs.npmjs.com/cli/install
Frank Tan
3
Traté de usar de esta manera, pero mi módulo no puede encontrar sus dependencias de pares.
Witalo Benicio
1
es bueno rm -rf node_modulesantes y npm installdespués de ejecutar el script de respuesta.
Renato Volver
3
@FrankTan Sí, pero ¿cómo obtener el comportamiento anterior? ¡ Quiero la copia!
Michael
151

Dado que la misma persona me preguntó y respondió, agregaré un enlace npm como alternativa.

de documentos:

Esto es útil para instalar sus propias cosas, para que pueda trabajar en ellas y probarlas de forma iterativa sin tener que reconstruirlas continuamente.

cd ~/projects/node-bloggy  # go into the dir of your main project
npm link ../node-redis     # link the dir of your dependency

[Editar] A partir de NPM 2.0, puede declarar dependencias locales en package.json

"dependencies": {
    "bar": "file:../foo/bar"
  }
Luke W
fuente
11
Puede que no sea la intención original de la pregunta, pero es probablemente lo que la mayoría de las personas que encuentran esto a través de Google quieren.
Dusty J
1
Esta respuesta parece incompleta, debe ejecutar npm linkcontra la carpeta una vez (para crear un enlace simbólico global) y luego ejecutarla npm link package-namedentro de la carpeta del proyecto (para usar el enlace simbólico global en su proyecto). La respuesta a continuación es la respuesta correcta.
Thomas Potaire
8
@ThomasPotaire ambas respuestas son correctas. Si observa la documentación del enlace npm, presenta ambos métodos, con este enfoque de directorio relativo como una forma abreviada.
MJ
1
El segundo método (usando el file:enfoque) permitió que mi aplicación y el módulo local compartieran una dependencia. Mi prueba de npm linkresultó en una dependencia duplicada, que rompe cosas si la dependencia necesita ser utilizada como un singleton.
Daniel Waltrip
Tenía un paquete local (digamos package1), package2 tiene una dependencia mencionada con la ruta relativa de package1. npm no instalo el paquete cuando la ruta relativa comienza con "file: ../../ package1", que funciona cuando es '' ../../package1 ", ¿agregar algo al principio significa algo más?
Dip686
17

npm pack + package.json

Esto es lo que funcionó para mí:

PASO 1: En module project, ejecute npm pack:

Esto construirá un <package-name>-<version>.tar.gz archivo.

PASO 2: mueva el archivo a consumer project

Idealmente, puede colocar todos esos archivos en una tmpcarpeta en su consumer-projectraíz:

PASO 3: Refiéralo en su package.json :

"dependencies": {
  "my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}

PASO 4: Installlos paquetes:

npm install o npm i oyarn

Ahora, su paquete estaría disponible en su consumer-project's node_modules carpeta.

Buena suerte...

Akash
fuente
10

Ninguno de estos enfoques ( npm linkopackage.json dependencia de archivos) funciona si el módulo local tiene dependencias pares que solo desea instalar en el alcance de su proyecto.

Por ejemplo:

/local/mymodule/package.json:
  "name": "mymodule",
  "peerDependencies":
  {
    "foo": "^2.5"
  }

/dev/myproject/package.json:
  "dependencies":
  {
    "mymodule": "file:/local/mymodule",
    "foo": "^2.5"
  }

En este escenario, npm configura myproject's node_modules/así:

/dev/myproject/node_modules/
  foo/
  mymodule -> /local/mymodule

Cuando el nodo se carga mymoduley lo hace require('foo'), el nodo resuelve el mymoduleenlace simbólico, y luego solo busca /local/mymodule/node_modules/(y sus antepasados) foo, lo que no encuentra. En cambio, queremos que el nodo mire /local/myproject/node_modules/, ya que desde allí ejecutamos nuestro proyecto y dónde fooestá instalado.

Por lo tanto, necesitamos una forma de decirle al nodo que no resuelva este enlace simbólico cuando lo busque foo, o necesitamos una forma de decirle a npm que instale una copia de mymodulecuándo se usa la sintaxis de dependencia de archivos package.json. Tampoco he encontrado una manera de hacerlo, desafortunadamente :(

Paul Medynski
fuente
Encontré una solución alternativa, que es establecer NODE_PATHpara apuntar al lugar node_modules/donde fooestá instalado. Entonces, para el caso anterior, sería este: NODE_PATH=/dev/myproject/node_modules/ eso permite mymoduleencontrar foo.
Paul Medynski
Hay una solución para. Coloque los módulos de dependencia en la carpeta raíz del proyecto . Defina sus dependencias en package.json con el prefijo habitual 'file:' . Do npm i Esto creará un enlace simbólico en los módulos_nodo del proyecto, así como sus dependencias se pueden izar a los módulos_nodo de nivel superior como lo harían para otros tipos de dependencias. Mi versión npm es v6.14.4. Después de pasar un par de horas sobre cómo solucionar esto, encontré esta solución aquí: ( atmos.washington.edu/~nbren12/reports/journal/… ). Gracias nbren12.
sasebot
Estaba teniendo el mismo problema. Encontré esta respuesta: stackoverflow.com/questions/50807329/… , esto resuelve mi problema con las dependencias pares y las bibliotecas locales.
theawless
0

¿Falta la propiedad principal?

Como han respondido las personas anteriores npm --save ../location-of-your-packages-root-directory. Sin ../location-of-your-packages-root-directoryembargo, debe tener dos cosas para que funcione.

1) package.jsonen ese directorio apuntado hacia

2) la mainpropiedad en el package.jsondebe establecerse y trabajar ig "main": "src/index.js",si el archivo de entrada ../location-of-your-packages-root-directoryes../location-of-your-packages-root-directory/src/index.js

K - La toxicidad en SO está creciendo.
fuente