Esta documentación responde muy mal a mi pregunta. No entendí esas explicaciones. ¿Alguien puede decir en palabras más simples? ¿Quizás con ejemplos si es difícil elegir palabras simples?
EDIT también agregó peerDependencies
, que está estrechamente relacionado y puede causar confusión.
optionalDependencies
ahora.Respuestas:
Resumen de importantes diferencias de comportamiento:
dependencies
están instalados en ambos:npm install
de un directorio que contienepackage.json
npm install $package
en cualquier otro directoriodevDependencies
son:npm install
un directorio que contienepackage.json
, a menos que pase la--production
bandera (vaya a votar la respuesta de Gayan Charith ).npm install "$package"
ningún otro directorio, a menos que le dé la--dev
opción.peerDependencies
:npm install
, y debe resolver la dependencia usted mismo manualmente. Cuando se ejecuta, si falta la dependencia, aparece un error (mencionado por @nextgentech )Transitividad (mencionado por Ben Hutchison ):
dependencies
se instalan transitivamente: si A requiere B y B requiere C, entonces C se instala, de lo contrario, B no podría funcionar, y tampoco A.devDependencies
no está instalado transitivamente Por ejemplo, no necesitamos probar B para probar A, por lo que las dependencias de prueba de B pueden omitirse.Opciones relacionadas no discutidas aquí:
bundledDependencies
que se discute en la siguiente pregunta: Ventajas de las dependencias agrupadas sobre las dependencias normales en NPMoptionalDependencies
(mencionado por Aidan Feldman )devDependencies
dependencies
son necesarios para ejecutar,devDependencies
solo para desarrollar, por ejemplo: pruebas unitarias, CoffeeScript a JavaScript, recopilación, minificación, ...Si va a desarrollar un paquete, descárguelo (por ejemplo, a través de
git clone
), vaya a su raíz que contienepackage.json
y ejecute:Como tiene la fuente real, está claro que desea desarrollarla, por lo que, de manera predeterminada, tanto
dependencies
(como debe, por supuesto, ejecutar para desarrollar) como lasdevDependency
dependencias también están instaladas.Sin embargo, si solo es un usuario final que solo desea instalar un paquete para usarlo, lo hará desde cualquier directorio:
En ese caso, normalmente no quieren las dependencias de desarrollo, por lo que acaba de obtener lo que se necesita para usar el paquete:
dependencies
.Si realmente desea instalar paquetes de desarrollo en ese caso, puede establecer la
dev
opción de configuracióntrue
, posiblemente desde la línea de comandos como:La opción es
false
por defecto ya que este es un caso mucho menos común.Dependencias
(Probado antes de 3.0)
Fuente: https://nodejs.org/en/blog/npm/peer-dependencies/
Con dependencias regulares, puede tener múltiples versiones de la dependencia: simplemente se instala dentro
node_modules
de la dependencia.Por ejemplo, si
dependency1
ydependency2
ambos dependen dedependency3
versiones diferentes, el árbol del proyecto se verá así:Sin embargo, los complementos son paquetes que normalmente no requieren el otro paquete, que se denomina host en este contexto. En lugar:
Por ejemplo, si
dependency1
y pordependency2
pares dependendependency3
, el árbol del proyecto se verá así:Esto sucede aunque nunca lo mencione
dependency3
en supackage.json
archivo.Creo que esta es una instancia del patrón de diseño de Inversión de control .
Un ejemplo prototípico de dependencias entre pares es Grunt, el host y sus complementos.
Por ejemplo, en un complemento de Grunt como https://github.com/gruntjs/grunt-contrib-uglify , verá que:
grunt
es unpeer-dependency
require('grunt')
está debajotests/
: el programa no lo utiliza realmente.Luego, cuando el usuario usará un complemento, implícitamente requerirá el complemento al
Gruntfile
agregar unagrunt.loadNpmTasks('grunt-contrib-uglify')
línea, pero esgrunt
que el usuario llamará directamente.Esto no funcionaría si cada complemento requiriera una versión diferente de Grunt.
Manual
Creo que la documentación responde bastante bien a la pregunta, tal vez no esté tan familiarizado con los nodos / otros gestores de paquetes. Probablemente solo lo entiendo porque sé un poco sobre el paquete Ruby.
La línea clave es:
Y luego en npm-config (7) encuentra
dev
:fuente
npm install package
un comando que usaría para instalar todos los paquetes que no son dependencias del desarrollador, en lugar de lo que ahora creo que quiso decir, que era 'instalar el paquete llamado [paquete]', que fue como pensé que funcionaba antes de leer esto Si fuera usted, editaría para decir [nombre-paquete], lo que muestra claramente que lo que quiere decir es 'insertar nombre-aquí'.peerDependencies
comportamiento en el próximo npm @ 3. De blog.npmjs.org/post/110924823920/npm-weekly-5 : "Ya no descargaremos automáticamente la dependencia de pares. En su lugar, le avisaremos si la dependencia de pares no está instalada. Esto requiere que usted para resolver conflictos de dependencia entre usted mismo, manualmente, pero a la larga esto debería hacer que sea menos probable que termine en un lugar complicado con las dependencias de sus paquetes ".npm install
desde el paquete A, obtendrá B y C pero no D.devDependencies
no se instalan cuandoNODE_ENV
está configurado enproduction
.Si no desea instalar devDependencies, puede usar
npm install --production
fuente
--save
opción ya no es necesaria. Si hace "npm install my-package", agregará my-package como una dependencia en supackage.json
archivo.Como ejemplo, mocha normalmente sería una dependencia de desarrollo, ya que las pruebas no son necesarias en la producción, mientras que express sería una dependencia.
fuente
dependencias
Dependencias que su proyecto necesita ejecutar, como una biblioteca que proporciona funciones a las que llama desde su código.
Se instalan transitivamente (si A depende de B depende de C, npm install en A instalará B y C).
Ejemplo: lodash: su proyecto llama a algunas funciones lodash.
devDependencies
Dependencias que solo necesita durante el desarrollo o el lanzamiento, como compiladores que toman su código y lo compilan en javascript, marcos de prueba o generadores de documentación.
No se instalan transitivamente (si A depende de B, dev depende de C, npm install en A solo instalará B).
Ejemplo: gruñido: su proyecto utiliza gruñido para construirse.
peerDependencies
Dependencias a las que su proyecto se conecta o modifica en el proyecto principal, generalmente un complemento para alguna otra biblioteca o herramienta. Solo pretende ser una verificación, asegurándose de que el proyecto principal (proyecto que dependerá de su proyecto) tenga una dependencia en el proyecto al que se conecta. Entonces, si crea un complemento C que agrega funcionalidad a la biblioteca B, entonces alguien que realice un proyecto A necesitará tener una dependencia de B si tiene una dependencia de C.
No están instalados (a menos que npm <3), solo sean comprobado
Ejemplo: gruñido: su proyecto agrega funcionalidad a gruñido y solo se puede usar en proyectos que usan gruñido.
Esta documentación explica muy bien las dependencias entre pares: https://nodejs.org/en/blog/npm/peer-dependencies/
Además, la documentación de npm se ha mejorado con el tiempo y ahora tiene mejores explicaciones de los diferentes tipos de dependencias: https://github.com/npm/cli/blob/latest/doc/files/package.json.md#devdependencies
fuente
Para guardar un paquete en package.json como dependencias de desarrollo:
Cuando lo ejecutes
npm install
, instalará ambosdevDependencies
ydependencies
. Para evitar la instalación,devDependencies
ejecute:fuente
Hay algunos módulos y paquetes solo necesarios para el desarrollo, que no son necesarios en la producción. Como lo dice en la documentación :
fuente
Una explicación simple que me dejó más claro es:
Cuando implementa su aplicación, los módulos en dependencias deben instalarse o su aplicación no funcionará. No es necesario instalar módulos en devDependencies en el servidor de producción ya que no está desarrollando en esa máquina. enlace
fuente
vendor.js
, todas las bibliotecas se incluirán, todos nuestros departamentos deberían ser deps si el código compilado se confirma en el repositorio. Y debe confirmarse, ya que de lo contrario es extraño que tenga que compilar el módulo, no solo instalarlo (y las pruebas también están en algún lugar aquí, ya que cualquier cambio en los submódulos puede conducir a una regresión) ...webpack -p
quiero decir. por favor responde mi pregunta.Me gustaría agregar a la respuesta mi opinión sobre estas explicaciones de dependencias
dependencies
se usan para uso directo en su base de código, cosas que generalmente terminan en el código de producción o fragmentos de códigodevDependencies
se utilizan para el proceso de compilación, herramientas que lo ayudan a administrar cómo terminará el código final, módulos de prueba de terceros (por ejemplo, material webpack)fuente
En breve
Dependencias :
npm install <package> --save-prod
instala los paquetes requeridos por su aplicación en el entorno de producción.DevDependencies :
npm install <package> --save-dev
instala paquetes necesarios solo para desarrollo y pruebas localesSimplemente escribiendo
npm install
instala todos los paquetes mencionados en package.jsonasí que si está trabajando en su computadora local simplemente escriba
npm install
y continúe :)fuente
peerDependencies
no tenía sentido para mí hasta que leí este fragmento de una publicación de blog sobre el tema que Ciro mencionó anteriormente :El complemento espera una versión específica del host ...
peerDependencies
son para complementos, bibliotecas que requieren una biblioteca "host" para realizar su función, pero pueden haberse escrito en un momento anterior al lanzamiento de la última versión del host.Es decir, si escribo
PluginX v1
paraHostLibraryX v3
y me alejo, no hay garantíaPluginX v1
funcionará cuandoHostLibraryX v4
(o inclusoHostLibraryX v3.0.1
) se libera.... pero el complemento no depende del host ...
Desde el punto de vista del complemento, solo agrega funciones a la biblioteca host. Realmente no "necesito" que el host agregue una dependencia a un complemento, y los complementos a menudo no dependen literalmente de su host. Si no tiene el host, el complemento no hace nada inofensivo.
Esto significa
dependencies
que no es realmente el concepto correcto para los complementos.Peor aún, si mi host fuera tratado como una dependencia, terminaríamos en esta situación que menciona la misma publicación del blog (editado un poco para usar el host y el complemento inventados de esta respuesta):
... y el host obviamente no depende del complemento ...
... ese es el objetivo de los complementos. Ahora, si el host fuera lo suficientemente amable como para incluir información de dependencia para todos sus complementos, eso resolvería el problema, pero eso también introduciría un gran problema cultural nuevo : ¡administración de complementos!
El objetivo de los complementos es que pueden emparejarse de forma anónima. En un mundo perfecto, hacer que el anfitrión los administre todo sería ordenado, pero no vamos a requerir bibliotecas de gatos de rebaño.
Si no somos jerárquicamente dependientes, tal vez somos pares intradependientes ...
En cambio, tenemos el concepto de ser compañeros. Ni el host ni el complemento se encuentran en el grupo de dependencia del otro. Ambos viven en el mismo nivel del gráfico de dependencia.
... pero esta no es una relación automatizable. <<< Moneyball !!!
Si soy
PluginX v1
y espero un par de (es decir, tengo una dependencia de par de )HostLibraryX v3
, lo diré. Si se ha actualizado automáticamente a la últimaHostLibraryX v4
versión (tenga en cuenta que es la versión 4 ) Y se haPlugin v1
instalado, debe saberlo, ¿verdad?npm
no puede manejar esta situación por mí... o ...
¿Qué tal no, npm?
Entonces npm no. Le alerta sobre la situación y le permite determinar si
HostLibraryX v4
es un par adecuado para élPlugin v1
.Coda
Una buena
peerDependency
administración de complementos hará que este concepto funcione de manera más intuitiva en la práctica. De la publicación del blog , una vez más ...fuente
Dependencias vs dependencias de desarrollo
Las dependencias de desarrollo son módulos que solo se requieren durante el desarrollo, mientras que las dependencias se requieren en tiempo de ejecución. Si está implementando su aplicación, se deben instalar las dependencias, o su aplicación simplemente no funcionará. Las bibliotecas a las que llama desde su código que permite que el programa se ejecute pueden considerarse dependencias.
Por ejemplo, reaccionar, reaccionar - dom
No es necesario instalar módulos de dependencia de desarrollo en el servidor de producción, ya que no va a desarrollar en esa máquina. Los compiladores que convierten su código a JavaScript, marcos de prueba y generadores de documentos pueden considerarse dependencias de desarrollo, ya que solo son necesarios durante el desarrollo.
Por ejemplo: ESLint, Babel, webpack
@FYI,
Si está publicando en npm, entonces es importante que use el indicador correcto para los módulos correctos. Si es algo que su módulo npm necesita para funcionar, utilice el indicador "--save" para guardar el módulo como una dependencia. Si es algo que su módulo no necesita para funcionar pero es necesario para la prueba, entonces use el indicador "--save-dev".
fuente
Cuando intente distribuir un paquete npm, debe evitar usarlo
dependencies
. En su lugar, debe considerar agregarlopeerDependencies
o eliminarlodependencies
.fuente
Encontré una explicación simple.
Respuesta corta:
dependencias "... son aquellas que su proyecto realmente necesita para poder trabajar en la producción".
devDependencies "... son las que necesita durante el desarrollo".
peerDependencies "si desea crear y publicar su propia biblioteca para que pueda usarse como una dependencia"
Más detalles en esta publicación: https://code-trotter.com/web/dependencies-vs-devdependencies-vs-peerdependencies
fuente