¿Por qué, por ejemplo, un complemento de Grunt define su dependencia de Grunt como " dependencias entre pares "?
¿Por qué el complemento no puede tener Grunt como su propia dependencia en grunt-plug / node_modules ?
Las dependencias entre pares se describen aquí: https://nodejs.org/en/blog/npm/peer-dependencies/
Pero realmente no lo entiendo.
Ejemplo
Estoy trabajando con AppGyver Steroids en este momento, que utiliza tareas de Grunt para construir mis archivos de origen en una carpeta / dist / para que se sirvan en un dispositivo local. Soy bastante nuevo en npm y gruñido, así que quiero comprender completamente lo que está sucediendo.
Hasta ahora entiendo esto:
[rootfolder] /package.json le dice a npm que depende del grunt-steroids
paquete npm para el desarrollo:
"devDependencies": {
"grunt-steroids": "0.x"
},
Bueno. La ejecución de npm install en [rootfolder] detecta la dependencia e instala grunt-steroids en [rootfolder] / node_modules / grunt-steroids .
Npm luego lee [rootfolder] /node_modules/grunt-steroids/package.json para que pueda instalar sus grunt-steroids
propias dependencias .:
"devDependencies": {
"grunt-contrib-nodeunit": "0.3.0",
"grunt": "0.4.4"
},
"dependencies": {
"wrench": "1.5.4",
"chalk": "0.3.0",
"xml2js": "0.4.1",
"lodash": "2.4.1"
},
"peerDependencies": {
"grunt": "0.4.4",
"grunt-contrib-copy": "0.5.0",
"grunt-contrib-clean": "0.5.0",
"grunt-contrib-concat": "0.4.0",
"grunt-contrib-coffee": "0.10.1",
"grunt-contrib-sass": "0.7.3",
"grunt-extend-config": "0.9.2"
},
Los paquetes de " dependencias " se instalan en [rootfolder] / node_modules / grunt-steroids / node_modules, lo cual es lógico para mí.
Las " devDependencies " no están instaladas, lo que estoy seguro es controlado por npm detectando que solo estoy tratando de usar grunt-steroids
, y no desarrollarlo.
Pero luego tenemos las " dependencias de pares ".
Estos se instalan en [rootfolder] / node_modules , y no entiendo por qué allí y no en [rootfolder] / node_modules / grunt-steroids / node_modules para evitar conflictos con otros plugins grunt (o lo que sea).
fuente
"grunt": "0.4.4"
es tanto en devDependencies como en peerDependencies, y tiene sentido para mí tener un duplicado allí, porque significa que necesito esegrunt
paquete para mi propio uso, pero también que los usuarios de mi la biblioteca puede usar su propia versión, siempre que respete el bloqueo de versión de peerDependencies ¿Es eso correcto? ¿O el ejemplo de OP es muy malo?JacksModule
depende deJillsModule ^1.0.0
conJillsModule
ser una dependencia de paresJacksModule
yYourCoolProject
estaban usandoJacksModule
yJillsModule ^2.0.0
, obtendremos la advertencia de dependencia entre pares por la NGP, que nos asesorarán para instalarJillsModule ^1.0.0
también. ¿Pero qué pasa entonces?YourCoolProject
ahora tendrá dos versiones deJillsModule
importable a travésimport jillsModule from "..."
? ¿Y cómo recuerdo que cuando usoJacksModule
necesito pasarle una instanciaJillsModule v1.0.0
?JacksModule
repositorio, actualizarlo para que dependaJillsModule ^2.0.0
y ofrecer un RP al responsable del proyecto. Puede ser útil enviar un error primero diciendo que esta dependencia está desactualizada y le gustaría ayudar a actualizarla. Si haces un buen PR, la mayoría de los mantenedores de la biblioteca lo fusionarán y te lo agradecerán. Si los mantenedores no responden, puede publicar su bifurcación en los espacios de nombres NPM debajo de su nombre y usar su bifurcación en su lugar. De cualquier manera, hay soluciones peropeerDependencies
no lo resuelve por sí solo.Le recomendaría que lea el artículo nuevamente primero. Es un poco confuso, pero el ejemplo con winston-mail le muestra la respuesta por qué:
En este caso, es posible tener múltiples versiones de un paquete que causarían algunos problemas. Las dependencias entre pares permiten a los desarrolladores de npm asegurarse de que el usuario tenga el módulo específico (en la carpeta raíz). Pero tiene razón con el punto de que describir una versión específica de un paquete generaría problemas con otros paquetes que usan otras versiones. Este problema tiene que ver con los desarrolladores de npm, como dicen los artículos
Por lo tanto, los desarrolladores deben seguir semver para definir las peerDependencies. Debería abrir un problema para el paquete de esteroides grunt en GitHub ...
fuente
multiple versions of a package which would cause some issues
pero ¿no es ese el objetivo de un administrador de paquetes? Incluso discuten esto más adelante en el mismo artículo donde hay 2 versiones del mismo paquete en el proyecto: una proporcionada por el desarrollador y otra por una biblioteca de terceros.winston
ejemplo, ¿ahora no puedo usar lawinston-mail
biblioteca porque mi versión no coincide con la dependencia de pares? Preferiría tener esa degradación temporal de la última y mejor para la biblioteca 1 que no poder usarla en absoluto.peerDependencies
explicado con el ejemplo más simple posible:ejecutar npm install en myPackage arrojará un error porque está intentando instalar la versión React
^15.0.0
Yfoo
que solo es compatible con React^16.0.0
.Las dependencias peer NO están instaladas.
fuente
foo
funciona con React 15 y React 16, entonces podría enumerar su Dependencia entre pares como>=15 < 17
.