¿Cómo instalar npm en un directorio específico?

Respuestas:

325

Puedes usar la --prefixopción:

mkdir -p ./install/here/node_modules
npm install --prefix ./install/here <package>

Los paquetes se instalarán en ./install/here/node_modules. El mkdires necesario ya que de lo contrario la NGP podría elegir una ya existente node_modulesdirectorio de más arriba en la jerarquía. (Ver documentación de npm en las carpetas ).

coudy
fuente
65
Parece que debe tener el archivo package.json en este directorio alternativo si usa la opción --prefix. ¿Hay alguna manera de tener package.json en el directorio actual e instalar en el directorio alternativo?
2
@fractal Mira mi respuesta para eso
yunzen
10
@coundy ¿Hay alguna forma de especificar la ruta para npm install(sin el nombre del paquete)? Lancé esto directamente, pero luego npm busca package.jsonen el {prefix}. Lo que también pretendo es ser capaz de permitir la packages.jsonraíz del proyecto y al mismo tiempo instalar todos los paquetes {project root}/{project webroot}.
automatix
Me encontré con un problema de recurrencia. ¿Hay alguna manera de decirle que se ejecute una vez? Lo resolví temporalmente cambiando el directorio y luego llamando npm install, pero --prefixparece una mejor solución, si no estaba causando una recurrencia.
adi518
47

En la documentación se indica: Use la opción de prefijo junto con la opción global :

La configuración del prefijo por defecto es la ubicación donde está instalado el nodo. En la mayoría de los sistemas, esto es / usr / local . En Windows, esta es la ubicación exacta del binario node.exe. En los sistemas Unix, es un nivel superior, ya que el nodo generalmente se instala en {prefix} / bin / node en lugar de {prefix} /node.exe .

Cuando se establece el indicador global , npm instala cosas en este prefijo. Cuando no está configurado, usa la raíz del paquete actual, o el directorio de trabajo actual si no está en un paquete ya.

(Énfasis por ellos)

Entonces, en su directorio raíz, puede instalar con

npm install --prefix <path/to/prefix_folder> -g

e instalará la node_modulescarpeta en la carpeta

<path/to/prefix_folder>/lib/node_modules
Yunzen
fuente
2
No puedes requireinstalar paquetes globalmente, ¿verdad?
Pavlo
3
@Pavlo ¿Ayuda esto? stackoverflow.com/questions/15636367/…
yunzen
1
Deberías agregar esto a la respuesta.
Pavlo
66
@Pavlo, no lo creo. No es la respuesta al OP.
Yunzen
@Pavlo Si un paquete se instala globalmente, lo necesitará de la misma manera que siempre. Entonces sí, puede requerir un paquete que esté instalado globalmente.
Rob Evans el
43

A partir de npm versión 3.8.6, puede usar

npm install --prefix ./install/here <package>

para instalar en el directorio especificado. NPM crea automáticamente una node_modulescarpeta incluso cuando node_modulesya existe un directorio en la jerarquía superior. También puede tener un package.jsonen el directorio actual y luego instalarlo en el directorio especificado usando la --prefixopción:

npm install --prefix ./install/here

A partir de npm 6.0.0, puede usar

npm install --prefix ./install/here ./

instalar el package.json en el directorio actual al directorio "./install/here". Hay una cosa que noté en Mac que crea un enlace simbólico a la carpeta principal dentro del directorio node_modules. Pero, todavía funciona.

NOTA: NPM respeta la ruta que ha especificado a través de la --prefixopción. Se resuelve según la documentación de npm en las carpetas , solo cuando npm installse usa sin la --prefixopción.

Rohit Sharma
fuente
1
Esto no parece funcionar, siempre me saleCan't install <current directory>: Missing package name
Tibor Blenessy
1
@TiborBlenessy Suponiendo que está hablando de la segunda declaración de instalación. Asegúrese de tener un archivo package.json válido en su directorio actual. Si aún no funciona, hágame saber su versión npm. Estos pasos solían funcionar con la versión npm especificada. Y, si ya no lo hacen, me encantaría profundizar y llegar a la causa raíz, y es posible que pueda encontrar una alternativa.
Rohit Sharma
1
@RohitSharma Usando npm 6.0.0, este método no funciona como se esperaba en el package.jsonarchivo./install/here
Christian Ivicevic
@ChristianIvicevic Puede usar npm install --prefix ./install/here ./ para instalar el package.json en el directorio actual en el directorio "./install/here". Hay una cosa que noté en Mac que crea un enlace simbólico a la carpeta principal dentro del directorio node_modules. Pero, todavía funciona con npm 6.0.0
Rohit Sharma
1
@Tanoro El tercer comando funcionará con npm 6.0.0 con la creación de enlaces simbólicos como se menciona en la respuesta. Nunca probé los primeros 2 comandos con npm v3.5.2, por eso mencioné la versión específica de npm con la que había intentado. No dude en actualizar la respuesta con comandos de trabajo para otras versiones también.
Rohit Sharma
0

Estoy usando una compilación de PowerShell y no pude ejecutar npm sin cambiar el directorio actual.

Terminé usando el comando de inicio y simplemente especificando el directorio de trabajo:

start "npm" -ArgumentList "install --warn" -wo $buildFolder
Malachy
fuente