¿Cómo establecer una ubicación personalizada para la instalación local del paquete npm?

177

¿Es posible especificar un destino de paquete personalizado para npm install, ya sea a través de un indicador de comando o una variable de entorno?

Por defecto, las instalaciones locales de npm terminan en node_modulesel directorio actual, pero quiero que se instale en node_modulesun directorio diferente, por ejemplo vendor/node_modules. ¿Cómo puedo hacer que eso suceda?

pje
fuente
¿Qué estás tratando de lograr? esto se ha discutido aquí: stackoverflow.com/questions/13668097/…
Pascal Belloncle
10
@PascalBelloncle: en lugar de instalar paquetes en subdirectorios de ./node_modules, quiero que npm los instale en subdirectorios de ./vendor/node_modules. (O que le digan que eso no es configurable.)
pje
1
Comprendí que eso es lo que quieres hacer, lo que no creo que sea posible fuera de la caja. Plus require tampoco funcionaría. Entonces te preguntaba por qué querías hacer esto. Quizás haya una solución alternativa para hacer lo que quieres.
Pascal Belloncle
1
Estoy instalando un paquete únicamente para su binario (es decir, solo se usará en la línea de comando y nunca required) pero no quiero instalarlo globalmente.
pje
Veo. Vea mi sugerencia a continuación entonces.
Pascal Belloncle

Respuestas:

180

TL; DR

Puede hacerlo utilizando la --prefixbandera y la --globalbandera *.

pje@friendbear:~/foo $ npm install bower -g --prefix ./vendor/node_modules
bower@0.7.0 /Users/pje/foo/vendor/node_modules/bower

* Aunque se trata de una instalación "global", los contenedores instalados no serán accesibles a través de la línea de comandos a menos que ~/foo/vendor/node_modulesexista en PATH.

TL; R

Cada atributo configurable de npmse puede establecer en cualquiera de los seis lugares diferentes. En orden de prioridad:

  • Banderas de línea de comando: --prefix ./vendor/node_modules
  • Variables de entorno: NPM_CONFIG_PREFIX=./vendor/node_modules
  • Archivo de configuración de usuario: $HOME/.npmrco userconfigparam
  • Archivo de configuración global: $PREFIX/etc/npmrco userconfigparam
  • Archivo de configuración incorporado: path/to/npm/itself/npmrc
  • Configuración predeterminada: node_modules / npmconf / config-defs.js

Por defecto, los paquetes instalados localmente entran ./node_modules. los globales van a la prefixvariable de configuración ( /usr/localpor defecto).

Puede ejecutar npm config listpara ver su configuración actual y npm config editcambiarla.

PD

En general, npmla documentación es realmente útil. La sección de carpetas es una buena descripción estructural de npm y la sección de configuración responde a esta pregunta.

pje
fuente
2
Como pruebo, en realidad si sigo el comando anterior, se instalará en el ./vendor/node_modules/lib/bowerusonpm#3.8.0
e-cloud
2
Al hacer esto, recibo un errorNo version provided in package.json
FooBar
Usted escribe bins won't be accessible through the command line. Por supuesto, el programa puede invocarse utilizando la ruta completa npm install [email protected] -g --prefix c:\my_npm` calling c: \ my_npm \ eslint --fix my.js`
Bernhard Döbler
13
¿Es posible lograr algo similar con un archivo package.json? es decir, si ejecuto npm installen el directorio A con el archivo package.json, los paquetes se instalarán en el directorio B. Parece que esta solución es para paquetes individuales que se están instalando.
Ryan-Neal Mes
1
¿Hay alguna forma de instalar todas las dependencias utilizando este método? npm installinstala dependencias localmente. npm install X -g -prefix "..."instala el módulo X en el prefijo, npm install -g -prefix "..."instala el paquete actual en el prefijo.
AnnanFay
28

Si desea esto en la configuración, puede configurar npm config de la siguiente manera:

npm config set prefix "$(pwd)/vendor/node_modules"

o

npm config set prefix "$HOME/vendor/node_modules"

Comprueba tu configuración con

npm config ls -l

O como dice @pje y usa la --prefixbandera

Rimian
fuente
44
Creo que esto establece el prefijo global? Por lo tanto npm install, aún se instalará localmente, ./node_modulespero npm install -gse instalará en "$(pwd)/vendor/node_modules". Me imagino la configuración y luego me olvido de eso, volviendo más tarde preguntándome por qué mis paquetes globales están actuando de manera extraña.
AnnanFay
13

Para OSX, puede ir a su usuario $HOME(probablemente / Users / yourname /) y, si aún no existe, crear un .npmrcarchivo (un archivo que npm usa para la configuración del usuario) y crear un directorio para que sus paquetes npm instalarse en (por ejemplo, / Users / yourname / npm). En ese archivo .npmrc, establezca "prefijo" en su nuevo directorio npm, que será donde se instalarán los paquetes npm instalados "globalmente"; estos paquetes "globales", obviamente, estarán disponibles solo para su cuenta de usuario.

En .npmrc:

prefix=${HOME}/npm

Luego ejecute este comando desde la línea de comando:

npm config ls -l

Debería dar salida tanto en su propia configuración local como en la configuración global npm, y debería ver reflejada su configuración de prefijo local, probablemente cerca de la parte superior de la larga lista de salida.

Por seguridad, recomiendo este enfoque para configurar el comportamiento de npm de su cuenta de usuario en lugar de compartir sus /usr/localcarpetas, lo que he visto recomendado en otros lugares.

Ryan
fuente
9

En Windows 7, por ejemplo, se podría usar el siguiente conjunto de comandos / operaciones.

Cree una variable de entorno personal, las barras diagonales inversas son obligatorias:

  • Nombre de la variable: %NPM_HOME%
  • Valor variable: C:\\SomeFolder\\SubFolder\\

Ahora, configure los valores de configuración en las nuevas carpetas (nombres de archivo ejemplares):

  • Establecer la carpeta npm

npm config set prefix "%NPM_HOME%\\npm"

  • Establecer la carpeta npm-cache

npm config set cache "%NPM_HOME%\\npm-cache"

  • Establecer la carpeta temporal npm

npm config set tmp "%NPM_HOME%\\temp"

Opcionalmente, puede purgar el contenido de las carpetas originales antes de cambiar la configuración.

  • Eliminar el npm-cache npm cache clear

  • Listar los módulos npm npm -g ls

  • Eliminar los módulos npm npm -g rm name_of_package1 name_of_package2

MichaelHuelsen
fuente
1
Gracias, sigo los pasos. Pero crea un directorio llamado c: /% NPM_HOME% / npm, etc. en lugar de c: / npm_home / npm
Jay
6

Después de buscar esto yo mismo queriendo que varios proyectos con dependencias compartidas fueran SECOS, encontré:

  • La instalación local es la forma de nodo para cualquier cosa que desee usar a través de require()
  • La instalación global es para los binarios que desea en su camino, pero no está destinado a nada a través de require()
  • El uso de un prefijo significa que debe agregar las rutas apropiadas binyman$PATH
  • npm link( info ) le permite usar una instalación local como fuente para globales

→ adhiérase al Nodo e instálelo localmente

árbitro:

Oli Studholme
fuente