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.
¿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
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.
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.
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
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.
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ó.
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.
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".
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.
--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
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:
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.
npm install --production
. Esa es la diferencia operativa (consulte https://docs.npmjs.com/cli/install para obtener más información).NODE_ENV
en producción, solonpm install
excluye automáticamente los paquetes de desarrollo.Respuestas:
--save-dev
se 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.fuente
-D
es la abreviatura de--save-dev
y-S
es la abreviatura de--save
--save
opción ya no es necesaria. Si lo hacenpm install my-package
, agregará "my-package" como una dependencia en el archivo package.json.La diferencia entre
--save
y--save-dev
puede 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
Esto crearía un nuevo valor en su paquete.json
Cuando está desarrollando, realmente ayuda usar herramientas como conjuntos de pruebas y puede necesitar jasmine-core y karma . En este caso usarías
Esto también crearía un nuevo valor en su paquete.json
No necesita el conjunto de pruebas para ejecutar la aplicación en su estado normal, por lo que es una
--save-dev
dependencia 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
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.
fuente
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
dependencies
sección de supackage.json
.--save-dev
agrega 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 ejecutanpm install
en él.--save
agrega el paquete de terceros a las dependencias del paquete. Se instalará junto con el paquete cada vez que alguien ejecutenpm 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.json
archivo del paquete .--save
agrega adependencies
,--save-dev
agrega adevDependencies
La documentación de instalación de npm se puede consultar aquí.
fuente
dependency package name is going to install.
en node_modules ... no en el paquete del desarrollador como en la dependencia de desarrollo.Un ejemplo perfecto de esto es:
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.
fuente
--save
todavía solo se guardan en lanode_modules
carpeta. El código no está incluido en el sitio web implementado.--save-dev
bandera, el paquete se agrega a sudevDependencies
objeto. Si / cuando alguien instala su paquete, todosdependencies
se descargan perodevDependencies
no, 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 ejecutarsenpm install
dentro del directorio del paquete para instalardevDependencies
también.npm install
, ¿devDependencies
se ignoran?Dejame darte un ejemplo,
jest
para probar y ellos lo usanmocha
. ¿Quieres que se instalenjest
también? ¿Solo para ejecutar tu biblioteca?No. verdad? Por eso están adentro
devDependencies
.Cuando alguien lo hace,
npm i yourPackage
solo 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 clone
su repositorio y cuándo haríannpm i
las 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
devDependencies
que contiene todas las bibliotecas de prueba / construcción / burla que USTED usó.fuente
Como lo sugiere @ andreas-hultgren en esta respuesta y de acuerdo con los documentos de npm :
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-dev
es una apuesta segura en el desarrollo de aplicaciones web , al menos.fuente
--save-dev
en los que el paquete no instalaría sus dependencias requeridas. Running--save
instaló esas dependencias faltantes.--save
para 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.--save-dev
es cada vez menos claro con cada respuesta aquí :)--save-dev
guarda la especificación de semver en la matriz "devDependencies" en el archivo descriptor del paquete, en su lugar la--save
guarda en "dependencias".fuente
--save-dev
crea paquetes locales para su proyecto, mientras que los--save
hace locales para su instalación de nodo?Ya se proporcionan respuestas claras. Pero vale la pena mencionar cómo
devDependencies
afecta la instalación de paquetes:Ver: https://docs.npmjs.com/cli/install
fuente
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
).Si abre el
package.json
archivo, verá estas entradas en dos secciones diferentes:fuente
--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
fuente
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
dependencies
dedevDependencies
mediante el uso de--save
o--save-dev
. Para instalar todo lo que usamos:Para instalar solo paquetes de producción debemos usar:
fuente
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
dependencies
para compilarSi 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
--save
o--save-dependencies
solo necesitamonaco-min.js
Resumen:
Si alguien quiere compilar sus códigos (usar como biblioteca), ponga el
lodash
que usan sus códigos endependencies
Si alguien quiere agregar más funciones a sus códigos, necesita
unit test
ycompiler
, póngalos endev-dependencies
fuente
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.
fuente