¿Cómo evita la instalación de módulos NPM "devDependencies" para Node.js (package.json)?

588

Tengo esto en mi archivo package.json (versión abreviada):

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

Estoy usando NPM versión 1.1.1 en Mac 10.6.8.

Cuando ejecuto el siguiente comando desde la raíz del proyecto, instala tanto el dependencies y devDependencies :

npm install

Tenía la impresión de que este comando instaló el devDependencies:

npm install --dev

¿Cómo hago para que npm installsolo se instale dependencies(para que el entorno de producción solo obtenga esos módulos), mientras que algo así como npm install --devinstala ambos dependenciesy devDependencies?

Lance Pollard
fuente
1
Según el documento, tienes razón, el --dev instala los devdeps, de lo contrario, solo los deps. npmjs.org/doc/json.html . Sé que esto funciona para paquetes con nombre, al menos.
mna
1
si se encuentra con esta pregunta en 2015, el conmutador --save-dev hace el truco exactamente como se le preguntó en esta pregunta.
Anand
1
Esta respuesta stackoverflow.com/a/22004559/3718119 da una buena explicación a las diferencias entre dependenciesy devDependenciesy cuando cada uno de ellos se utiliza.
cuasoft

Respuestas:

844

El npm installcomando instalará el devDependenciesotro junto dependenciescuando se ejecute dentro de un directorio de paquetes, en un entorno de desarrollo (el valor predeterminado).

Use npm install --only=prod(o --only=production) para instalar solo dependencies , y no devDependencies,independientemente del valor de la NODE_ENVvariable de entorno.

Fuente: npm docs

Nota: Antes de la v3.3.0 de npm (2015-08-13), se llamó a la opción --production, es decir npm install --production.

Rohan Singh
fuente
2
El razonamiento de Agate probablemente sea eliminar devDependencies para que los consumidores que instalen su paquete npm install yourpackage.tgzno obtengan también devDependencies. Sin embargo, ese ya es el caso. Vea la respuesta de Kevin Cox a continuación ( stackoverflow.com/a/15826602/825588 ).
Johann
55
npmjs.org/doc/cli/npm-install.html "Por defecto, npm install instalará todos los módulos listados como dependencias. Con el indicador --production, npm no instalará los módulos listados en devDependencies".
tomByrer
14
Oh Dios mío. Totalmente tenía NODE_ENV=productionalgo más que estaba haciendo y no podía entender por qué npm installno instalar dependencias. Gracias por la respuesta completa.
aendrew
1
npm install --dev solo instalaría dependencias de desarrollo
Rustem K
10
Para npm 3.3 y posteriores: npm WARN install El uso de la --devopción está en desuso. Usar en su --only=devlugar.
srcspider
232

¡También me encuentro con ese problema! La instalación de npm es algo confusa y las publicaciones web siguen trayendo los indicadores -d / - dev como si hubiera un modo de instalación explícito de 'desarrollo'.

  • npm installinstalará tanto " dependencias " como " devDependencies "

  • npm install --productionsolo instalará " dependencias "

  • npm install --devsolo instalará " devDependencies "

smertrios
fuente
29
ADVERTENCIA: si NODE_ENVestá configurado productiony lo ejecuta npm install, no instalará dependencias de desarrollo. Me encontré con este problema en mi Dockerfile.
vaughan
1
@vaughan También me he encontrado con esto, se puede resolver ejecutando npm --production=false install(aunque no estoy seguro de si esto funcionará junto con la bandera --dev)
Bavell
138

La nueva opción es:

npm install --only=prod

Si desea instalar solo devDependencies:

npm install --only=dev
Cloxure
fuente
1
Esto responde lo contrario de la pregunta. OP pregunta cómo NO instalar devDependencies.
musicin3d
2
estás parcialmente correcto @ musicin3d, es por eso que en la primera parte respondí cómo instalar dependencias solo de producción y en la segunda parte cómo instalar dependencias solo de desarrollo, por si acaso.
Cloxure
55
Hola. Dejé ese comentario antes de que @ user1614572 agregara la parte sobre --only=prod. Usted, señor, está parcialmente en lo correcto. ; P
musicin3d
¿podemos incluir una dependencia separada para la implementación?
Jeeva Jsb
1
Es un comentario, no una respuesta. No reviso todos mis comentarios periódicamente. Nunca he visto personas que actualicen comentarios de hace años. Básicamente viniste aquí para criticar que puse un año en mi comentario. No voy a responder más. Diviértete trolleando a otras personas.
Jacques ジ ャ ッ ク
47

Si leyó este POST en 2016, logre lo que quiere usando

--only={prod[uction]|dev[elopment]} 

El argumento hará que solo se instalen devDependencies o solo no devDependencies, independientemente de NODE_ENV.

de: https://docs.npmjs.com/cli/install

wzr1337
fuente
¿Por qué capitalizar "POST"? docs.npmjs.com/cli/install documenta claramente AMBOS --productiony --only={prod[uction]|dev[elopment]}.
Dan Dascalescu
33

Si ya instaló todas sus dependencias y desea evitar tener que descargar nuevamente sus paquetes de producción de NPM, simplemente escriba:

npm prune --production

Esto eliminará sus dependencias de desarrollo de su node_modulescarpeta, lo cual es útil si está tratando de automatizar un proceso de dos pasos como

  1. Webpack mi proyecto, utilizando dependencias de desarrollo
  2. Cree una imagen de Docker utilizando solo módulos de producción

¡Correr npm pruneen el medio te ahorrará tener que reinstalar todo!

piercebot
fuente
19

Cuando se utiliza "npm install", los módulos se cargan y están disponibles en toda la aplicación, independientemente de si son "devDependencies" o "dependencias". Suma de esta idea: todo lo que su package.json define como una dependencia (cualquier tipo) se instala en node_modules.

El propósito de la diferencia entre dependencias / devDependencies / optionalDependencies es lo que los consumidores de su código pueden hacer w / npm para instalar estos recursos.

Según la documentación: https://npmjs.org/doc/json.html ...

Si alguien planea descargar y usar su módulo en su programa, entonces probablemente no quiera o necesite descargar y construir la prueba externa o el marco de documentación que usa.

En este caso, es mejor enumerar estos elementos adicionales en un hash devDependencies.

Estas cosas se instalarán siempre que se establezca el indicador de configuración --dev. Este indicador se establece automáticamente cuando se realiza el enlace npm o cuando se realiza la instalación npm desde la raíz de un paquete, y se puede administrar como cualquier otro parámetro de configuración npm. Ver config (1) para más información sobre el tema.

Sin embargo, para resolver esta pregunta, si SOLO desea instalar las "dependencias" usando npm, el siguiente comando es:

npm install --production

Esto puede confirmarse mirando el commit de Git que agregó este filtro (junto con algunos otros filtros [enumerados a continuación] para proporcionar esta funcionalidad).

Filtros alternativos que pueden ser utilizados por npm:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors

@dmarr intente usar npm install --production

creatovisguru
fuente
16

npm instalará dependencias de desarrollo al instalar desde dentro de un paquete (si hay un package.jsonen el directorio actual). Si es de otra ubicación (registro npm, repositorio de git, ubicación diferente en el sistema de archivos) solo instala las dependencias.

Kevin Cox
fuente
¿Podría por favor reformular? Creo que cometió un error en su paréntesis, creo que olvidó cerrarlo antes y su frase no tiene mucho sentido para mí (hablante de inglés no nativo). El comentario de Johann bajo la respuesta de Rohan Singh me indicó que buscara su respuesta (porque mi duda era exactamente la misma que la duda de la ágata), y no tuvo éxito. Todavía no entiendo cómo npm install some-moduleno instalará las dependencias de desarrollo de some-module.
Rafael Eyng
Gracias, arreglado. Sin embargo, no entiendo el resto de tu pregunta.
Kevin Cox
3

He descubierto que, al intentar instalar dependencias de desarrollo para un paquete que contiene un complemento de nodo, no puede evitar construir el complemento al ejecutar npm install --dev, incluso si solo desea instalar devDependencies. Entonces, tuve que dar la vuelta a npm:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

O, mejor (y más sucintamente) todavía,

node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install
Gabriel Schulhof
fuente
3

Utilice npm install packageName --saveesta agregará paquete de dependencias , si se utiliza npm install packageName --save-deventonces devDependencies .

npm install packageName --save-devdebe usarse para agregar paquetes con fines de desarrollo. Como agregar paquetes TDD (Chai, mocha, etc.). Que se utilizan en el desarrollo y no en la producción.

Sandip Nirmal
fuente
El OP no tiene problemas para guardar dependencias, package.jsonpero una vez que estas dependencias ya están guardadas , entonces, cómo forzar la npminstalación de solo un tipo específico de dependencia. Cuando leí su respuesta aquí, no aprendí nada que ayude a resolver el problema planteado por el OP.
Louis
3

Vale la pena mencionar que puede usar la NODE_ENVvariable de entorno para lograr el mismo resultado. Particularmente útil si está contenedorizando su aplicación Node (por ejemplo, Docker).

NODE_ENV=production npm install

El código anterior instalará todas sus dependencias, excepto las de desarrollo (es decir devDependencies).

si necesita utilizar variables de entorno en su Dockerfilemás información se puede encontrar aquí .

Las variables de entorno son fáciles de sobrescribir cuando sea necesario (por ejemplo, si desea ejecutar su conjunto de pruebas, por ejemplo, en Travis CI). Si ese fuera el caso, podría hacer algo como esto:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

Documentación de NPM aquí

producción

  • Predeterminado: falso
  • Tipo: booleano Establecido en verdadero para ejecutarse en modo "producción".

    1. devDependencies no se instalan en el nivel superior cuando se ejecuta la instalación local de npm sin ningún argumento.
    2. Establezca NODE_ENV = "producción" para los scripts de ciclo de vida.

Contenedor feliz =)

Francesco Casula
fuente
3

Sugiero usar npm ci. Si desea instalar solo paquetes necesarios para la producción (como escribió, sin devDependencies), entonces:

npm ci --only=production

o

NODE_ENV=production npm ci

Si prefiere la vieja escuela, npm installentonces:

npm install --production

o

NODE_ENV=production npm install

Aquí hay una buena respuesta por qué debería usar npm ci.

marverix
fuente
Genial, también funciona npm ci, ¡no solo npm install!
Klesun
2

Necesita agregar a la respuesta elegida: a partir de ahora, npm installen un directorio de paquetes (que contiene package.json) instalará devDependencies, mientras npm install -gque no las instalará.

ack
fuente
77
Sí, -gno se instalará devDependencies, pero sí instala los paquetes globalmente, lo que a menudo no es el resultado esperado.
Bardi Harborow
0

npm install --productiones la forma correcta de instalar módulos de nodo que son necesarios para la producción. Consulte la documentación para más detalles.

Rubin Bhandari
fuente
-1

Ahora hay un problema, si tiene package-lock.json con npm 5+. Tienes que eliminarlo antes de usarlo npm install --production.

Erich Stark
fuente
-1
npm install --dev will install dev dependencies

Y, según la pregunta para instalar solo dependencias, el siguiente comando ayudará

npm install --prod will install dependencies
karthiks416
fuente