¿Cuál es la diferencia entre --save y --save-dev?

747

Cuál es la diferencia entre:

npm install [package_name] --save

y:

npm install [package_name] --save-dev

¿Qué significa esto?

nfort
fuente
44
sí, estoy confundido acerca de esto: si usa una integración continua como Jenkins, ¿sabe Jenkins usar los módulos devDependencies para ejecutar pruebas? Supongo que sí, pero no es súper obvio.
Alexander Mills
55
quizás edite la pregunta para decir también, ¿cuál es la diferencia funcional entre dependencias y devDependencies?
Alexander Mills
55
Los paquetes instalados a través de la opción --save-dev no se reinstalan cuando el usuario ejecuta npm install --production. Esa es la diferencia operativa (consulte https://docs.npmjs.com/cli/install para obtener más información).
Andrew
77
@MuhammadUmer Esa es precisamente la razón por la cual las personas hacen preguntas aquí, para 'obtener una pista'. Quizás agregar una respuesta real sería más productivo; esta es definitivamente una distinción interesante de la que no estaba al tanto.
Simon_Weaver
3
Además, si establece la variable de entorno NODE_ENVen producción, solo npm installexcluye automáticamente los paquetes de desarrollo.
Muhammad Umer el

Respuestas:

591
  • --save-devse utiliza para guardar el paquete para fines de desarrollo. Ejemplo: pruebas unitarias, minificación.
  • --save se usa para guardar el paquete requerido para que se ejecute la aplicación.
Tuong Le
fuente
150
¿En qué se diferencian? ¿Cuándo usaría uno contra el otro? ¿Puedo usar el paquete en producción si está bajo --save-dev?
Dave Voyles
14
La respuesta responde sucintamente sus dos primeras preguntas. La respuesta a la última pregunta, "¿Puedo seguir usando el paquete en producción si está bajo --save-dev", es "no". Si bien es ciertamente posible hacer esto, no está destinado.
Technetium
61
Taquigrafía versiones: -Des la abreviatura de --save-devy -Ses la abreviatura de--save
Chrisco
164
Esta respuesta es frustrantemente vaga. Incluso un pequeño ejemplo ayudaría mucho a aclarar esto.
Choylton B. Higginbottom el
33
Tenga en cuenta que a partir de npm versión 5.0.0, la --saveopción ya no es necesaria. Si lo hace npm install my-package, agregará "my-package" como una dependencia en el archivo package.json.
Martin Carel
644

La diferencia entre --savey --save-devpuede no ser notoria inmediatamente si los ha probado en sus propios proyectos. Así que aquí hay algunos ejemplos ...

Digamos que estaba creando una aplicación que utilizaba el paquete de momento para analizar y mostrar fechas. Su aplicación es un planificador, por lo que realmente necesita este paquete para ejecutarse, como en: no se puede ejecutar sin él . En este caso usarías

npm install moment --save

Esto crearía un nuevo valor en su paquete.json

"dependencies": {
   ...
   "moment": "^2.17.1"
}

Cuando está desarrollando, realmente ayuda usar herramientas como conjuntos de pruebas y puede necesitar jasmine-core y karma . En este caso usarías

npm install jasmine-core --save-dev
npm install karma --save-dev

Esto también crearía un nuevo valor en su paquete.json

"devDependencies": {
    ...
    "jasmine-core": "^2.5.2",
    "karma": "^1.4.1",
}

No necesita el conjunto de pruebas para ejecutar la aplicación en su estado normal, por lo que es una --save-devdependencia de tipo, nada más. Puedes ver cómo si no entiendes lo que realmente está sucediendo, es un poco difícil de imaginar.

Tomado directamente de NPM docs docs # dependencias

Dependencias

Las dependencias se especifican en un objeto simple que asigna un nombre de paquete a un rango de versiones. El rango de versiones es una cadena que tiene uno o más descriptores separados por espacios. Las dependencias también se pueden identificar con una URL tarball o git.

No ponga arneses de prueba o transpiladores en su objeto de dependencias. Ver devDependencies , a continuación.

Incluso en los documentos, le pide que use --save-dev para módulos como los arneses de prueba.

Espero que esto ayude y sea claro.

Michael Bruce
fuente
15
OMI, creo que la palabra clave 'guardar' es un problema. ¿Por qué no hacen la marca -dev para desarrollar y -desplegar para la implementación? Tiene sentido que la palabra clave 'guardar'.
Thinh Vu
1
¿Por qué el paquete no sabe (decide) si es un paquete de lanzamiento o un paquete de desarrollo y se puede usar para ambos? Parece extraño hacer que el usuario instalador decida esto, cuando el desarrollador del paquete crea la intención.
CodeGrue
44
CodeGrue, si usa jQuery solo para probar componentes React, iría en save-dev, pero es posible que no lo use para construir su proyecto principal. Si, esto es posible. Entonces, ¿por qué el empaquetador sabe lo que está haciendo con él?
Michael Bruce
2
Mucho más claro. Soy un chico integrado que está aprendiendo el flujo de trabajo de Bootstra + Node.js por primera vez. No es obvio cuál es la diferencia.
Leroy105
3
@YakovL save-dev significa que los paquetes no se instalan cuando alguien más instala su paquete como su dependencia. Los paquetes que solo se usan para ejecutar scripts como start / build no serán necesarios en ese caso, por lo que se colocan en dependencias de desarrollo. Si está trabajando en una aplicación web y no en un paquete para que otros la usen, probablemente no debería preocuparse en absoluto.
riv
112

Por defecto, NPM simplemente instala un paquete en node_modules. Cuando intente instalar dependencias para su aplicación / módulo, primero deberá instalarlas y luego agregarlas a la dependenciessección de su package.json.

--save-devagrega el paquete de terceros a las dependencias de desarrollo del paquete. No se instalará cuando alguien instale su paquete. Por lo general, solo se instala si alguien clona su repositorio de origen y se ejecuta npm installen él.

--saveagrega el paquete de terceros a las dependencias del paquete. Se instalará junto con el paquete cada vez que alguien ejecute npm install package.

Las dependencias de desarrollo son aquellas que solo son necesarias para desarrollar el paquete. Eso puede incluir corredores de prueba, compiladores, empaquetadores, etc. Ambos tipos de dependencias se almacenan en el package.jsonarchivo del paquete . --saveagrega a dependencies, --save-devagrega adevDependencies

La documentación de instalación de npm se puede consultar aquí.

Lakshmi Swetha G
fuente
37
Sospeché que esto ... puede usar --save-dev y --save indistintamente si está compilando una aplicación web que no se convertirá en un paquete, es decir, descargado de npm, si está desarrollando un paquete para compartir con otros, Es importante entender la diferencia.
VFein
13
Gracias finalmente a alguien que dice su propósito cuando usas npm install
CapturedTree
3
--save ahora está predeterminado con npm install con el lanzamiento de npm 5 en 2017
NattyC
espera, ¿por qué oraciones complejas? En DevDependecy, el desarrollador puede instalar los paquetes, y se actualizará solo la devDevependency. Entonces, cuando un nuevo desarrollador clone la base de código del proyecto y ejecute npm install => aquí solo dependency package name is going to install.en node_modules ... no en el paquete del desarrollador como en la dependencia de desarrollo.
Anupam Maurya
60

Un ejemplo perfecto de esto es:

$ npm install typescript --save-dev

En este caso, desearía tener Typecript (un lenguaje de codificación analizable por JavaScript) disponible para el desarrollo, pero una vez que se implementa la aplicación, ya no es necesario, ya que todo el código se ha transpuesto a JavaScript. Como tal, no tendría sentido incluirlo en la aplicación publicada. De hecho, solo ocuparía espacio y aumentaría los tiempos de descarga.

Jackalope
fuente
44
Lo mismo ocurre con: "$ npm install grunt --save-dev", ya que es útil para el desarrollo, pero no para la implementación.
Jackalope
1
Una nota al margen: Microsoft sugiere instalar paquetes @ types / xxx como dependencias, no devDependencies github.com/Microsoft/types-publisher/issues/81
Dave
2
Lo que encuentro confuso es ¿cómo importa esto? Los paquetes guardados usando --savetodavía solo se guardan en la node_modulescarpeta. El código no está incluido en el sitio web implementado.
Kokodoko el
66
@Kokodoko Cuando usa la --save-devbandera, el paquete se agrega a su devDependenciesobjeto. Si / cuando alguien instala su paquete, todos dependenciesse descargan pero devDependenciesno, ya que no son necesarios en tiempo de ejecución. Como decía la respuesta, esto les ahorra tiempo y espacio. Los desarrolladores que trabajan en los archivos de su paquete pueden ejecutarse npm installdentro del directorio del paquete para instalar devDependenciestambién.
Jasjit Singh Marwah
Entonces, si descarga un repositorio de github y escribe npm install, ¿ devDependenciesse ignoran?
Kokodoko
41

Dejame darte un ejemplo,

  • Usted es desarrollador de una biblioteca npm muy SERIA . Que utiliza diferentes bibliotecas de prueba para probar el paquete.
  • Un usuario descargó su biblioteca y quiere usarla en su código. ¿También necesitan descargar sus bibliotecas de prueba? Tal vez lo usas jestpara probar y ellos lo usan mocha. ¿Quieres que se instalen jesttambién? ¿Solo para ejecutar tu biblioteca?

No. verdad? Por eso están adentro devDependencies.

Cuando alguien lo hace, npm i yourPackagesolo se instalarán las bibliotecas necesarias para EJECUTAR su biblioteca. No se instalarán otras bibliotecas que usó para agrupar su código o probar y burlarse porque las instaló devDependencies. Bastante bien, ¿verdad?

Entonces, ¿por qué los desarrolladores necesitan exponer las dependencias de desarrollo ?

Digamos que su paquete es un paquete de código abierto y cientos de personas envían solicitudes de extracción a su paquete. Entonces, ¿cómo van a probar el paquete? Tendrán git clonesu repositorio y cuándo harían npm ilas dependencias , así como las dependencias dev .
Porque no están usando tu paquete. Están desarrollando el paquete aún más, por lo tanto, para probar su paquete, necesitan pasar los casos de prueba existentes y escribir nuevos. Por lo tanto, necesitan usar su devDependenciesque contiene todas las bibliotecas de prueba / construcción / burla que USTED usó.

Aritra Chakraborty
fuente
8
Mucho mejor que la respuesta aceptada, así como la respuesta con los votos máximos, ya que esta respuesta es de naturaleza más práctica. ¡Gracias!
Excepción no capturada el
Esta debería ser la respuesta elegida. Todas las otras respuestas realmente no explican POR QUÉ usaría una sobre la otra.
Rocky Kev
34

Como lo sugiere @ andreas-hultgren en esta respuesta y de acuerdo con los documentos de npm :

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.

Sin embargo, para el desarrollo de aplicaciones web, Yeoman (una herramienta de andamiaje que instala un archivo package.json previamente revisado por pares, entre otras cosas) coloca todos los paquetes en devDependencies y nada en dependencias, por lo que parece que el uso de --save-deves una apuesta segura en el desarrollo de aplicaciones web , al menos.

wayfarer_boy
fuente
3
Tenga en cuenta que me he encontrado con problemas al usar gulp e instalar paquetes --save-deven los que el paquete no instalaría sus dependencias requeridas. Running --saveinstaló esas dependencias faltantes.
Nick M
18
También me gustaría señalar que ahora estoy usando --savepara todas las dependencias de prueba y documentación (según los documentos de npm). Estoy empezando a pensar que el ejemplo de Yeoman que mencioné anteriormente no es un buen ejemplo de mejores prácticas.
wayfarer_boy
Creo que también, ¿por qué alguna vez lo necesitarías --save-deves cada vez menos claro con cada respuesta aquí :)
Kokodoko
20

--save-devguarda la especificación de semver en la matriz "devDependencies" en el archivo descriptor del paquete, en su lugar la --saveguarda en "dependencias".

alex
fuente
83
y cual es la diferencia funcional?
ahnbizcad
66
esta respuesta tiene el mayor sentido para mí, entonces se requieren devDependencies para el desarrollo pero no para la producción, por lo que htmllint, sass compilation, etc. y Dependencies son para requisitos de producción, como Diaporama, que deberán estar presentes para que las cosas funcionen.
Miller el gorila
3
@ahnbizcad Aquí se responde mejor , pero la principal diferencia funcional es que devDependencies no se incluyen de forma transitiva.
Pace
¿No es la forma más intuitiva de describirlo para alguien que aún no sabe, esto ?: Dev --save-dev crea paquetes locales para su proyecto, mientras que los --savehace locales para su instalación de nodo?
ahnbizcad
9

Ya se proporcionan respuestas claras. Pero vale la pena mencionar cómo devDependenciesafecta la instalación de paquetes:

Por defecto, npm install instalará todos los módulos listados como dependencias en package.json. Con el indicador --production (o cuando la variable de entorno NODE_ENV se establece en producción), npm no instalará los módulos enumerados en devDependencies.

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

Alireza
fuente
8

Por lo general, no desea inflar el paquete de producción con cosas que solo tiene la intención de usar para fines de desarrollo.

Uso --save-dev(o-D opción ) para separar paquetes como marcos de prueba de unidad (jest, jazmín, mocha, chai, etc.)

Cualquier otro paquete que su aplicación necesite para Producción, debe instalarse usando --save(o -S).

npm install --save lodash       //prod dependency
npm install -S moment           // "       "
npm install -S opentracing      // "       "

npm install -D jest                 //dev only dependency
npm install --save-dev typescript   //dev only dependency

Si abre el package.jsonarchivo, verá estas entradas en dos secciones diferentes:

"dependencies": {
  "lodash": "4.x",
  "moment": "2.x",
  "opentracing": "^0.14.1"
},

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},
velhala
fuente
5

--save-dev se usa para módulos usados ​​en el desarrollo de la aplicación, no se requiere mientras se ejecuta en el entorno de producción --save se usa para agregarlo en package.json y se requiere para ejecutar la aplicación.

Ejemplo: express, body-parser, lodash, casco, mysql, todo esto se usa durante la ejecución de la aplicación, use --save para poner dependencias mientras que mocha, istanbul, chai, sonarqube-scanner se usan durante el desarrollo, así que póngalos en desarrollo -dependencias.

El enlace npm o la instalación npm también instalarán los módulos de dependencia de desarrollo junto con los módulos de dependencia en su carpeta de proyecto

Biswadev
fuente
3

Todas las explicaciones aquí son geniales, pero carecen de algo muy importante: ¿cómo se instalan solo las dependencias de producción? (sin las dependencias de desarrollo). Nos separamos dependenciesde devDependenciesmediante el uso de --saveo --save-dev. Para instalar todo lo que usamos:

npm i

Para instalar solo paquetes de producción debemos usar:

npm i --only=production
Ronny Sherer
fuente
0

Quiero agregar algunas de mis ideas como

Creo que todos los diferentes aparecerán cuando alguien use sus códigos en lugar de usarlos usted mismo

Por ejemplo, escribe una biblioteca HTTP llamada node's request

En tu biblioteca

usaste lodash para manejar cadenas y objetos, sin lodash, tus códigos no pueden ejecutarse

Si alguien usa su biblioteca HTTP como parte de sus códigos. Sus códigos serán compilados con los suyos.

tus códigos necesitan lodash, así que debes ponerlo dependenciespara compilar


Si escribes un proyecto como monaco-editor , que es un editor web,

tienes todos tus códigos y tu product env library usando webpack, cuando se completa la construcción, solo tiene unmonaco-min.js

Así que alguien haga caso si no --saveo--save-dependencies solo necesitamonaco-min.js

Resumen:

  1. Si alguien quiere compilar sus códigos (usar como biblioteca), ponga el lodashque usan sus códigos endependencies

  2. Si alguien quiere agregar más funciones a sus códigos, necesita unit testy compiler, póngalos endev-dependencies

caramelo
fuente
0

La gente usa npm en la producción para hacer cosas geniales, Node.js es un ejemplo de esto, por lo que no desea que se ejecuten todas sus herramientas de desarrollo.

Si está utilizando gulp (o similar) para crear archivos de compilación para poner en su servidor, entonces realmente no importa.

Tristanisginger
fuente