Por que, por exemplo, um plug-in Grunt define sua dependência do grunt como " dependências de pares "?
Por que o plug-in não pode ter apenas o Grunt como sua própria dependência no grunt-plug / node_modules ?
As dependências entre pares são descritas aqui: https://nodejs.org/en/blog/npm/peer-dependencies/
Mas eu realmente não entendo.
Exemplo
No momento, estou trabalhando com o AppGyver Steroids, que usa as tarefas do Grunt para criar meus arquivos de origem em uma pasta / dist / para ser exibido em um dispositivo local. Eu sou muito novo na NPM e grunhido, então eu quero compreender completamente o que está acontecendo.
Até agora eu entendi:
[rootfolder] /package.json diz ao npm que depende do grunt-steroids
pacote npm para desenvolvimento:
"devDependencies": {
"grunt-steroids": "0.x"
},
OK. A execução do npm install no [rootfolder] detecta a dependência e instala grunt-steroids em [rootfolder] / node_modules / grunt-steroids .
O Npm então lê [rootfolder] /node_modules/grunt-steroids/package.json para poder instalar suas grunt-steroids
próprias dependências .:
"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"
},
Os pacotes " dependências " são instalados em [rootfolder] / node_modules / grunt-steroids / node_modules, o que é lógico para mim.
O " devDependencies " não está instalado, o que eu tenho certeza que é controlado pelo npm detectando que estou apenas tentando usar grunt-steroids
, e não desenvolvendo.
Mas temos o " peerDependencies ".
Eles estão instalados em [rootfolder] / node_modules , e não entendo por que existe e não em [rootfolder] / node_modules / grunt-steroids / node_modules para que conflitos com outros plugins de grunhido (ou o que seja) sejam evitados?
fonte
"grunt": "0.4.4"
é tanto em devDependencies quanto em peerDependencies, e faz sentido ter uma duplicata lá, porque significa tanto que eu preciso dessegrunt
pacote para meu próprio uso, mas também que os usuários do meu A biblioteca pode usar sua própria versão, desde que respeite o bloqueio de versão peerDependencies. Isso está correto? Ou o exemplo do OP é muito ruim?JacksModule
dependeJillsModule ^1.0.0
deJillsModule
ser uma dependência de pares deJacksModule
eYourCoolProject
estavam usandoJacksModule
eJillsModule ^2.0.0
, vamos receber o aviso dependência de pares por NPM, o que nos aconselham a instalarJillsModule ^1.0.0
também. Mas o que acontece então?YourCoolProject
agora terá duas versõesJillsModule
importáveis atravésimport jillsModule from "..."
? E como me lembro que, quando usoJacksModule
, preciso passar uma instância deJillsModule v1.0.0
?JacksModule
repositório, atualizá-lo para dependerJillsModule ^2.0.0
e oferecer um PR ao mantenedor do projeto. Pode ser útil enviar um bug primeiro, dizendo que essa dependência está desatualizada e você gostaria de ajudar a atualizá-la. Se você faz um bom RP, a maioria dos mantenedores de bibliotecas o mescla e agradece por isso. Se os mantenedores não responderem, você pode publicar sua bifurcação no NPM com espaço de nome sob seu nome e, em vez disso, usar sua bifurcação. De qualquer forma, existem soluções, maspeerDependencies
não as resolve por si só.Eu recomendo que você leia o artigo novamente primeiro. É um pouco confuso, mas o exemplo com o winston-mail mostra a resposta por que:
Nesse caso, é possível ter várias versões de um pacote, o que causaria alguns problemas. As dependências entre pares permitem que os desenvolvedores do npm garantam que o usuário tenha o módulo específico (na pasta raiz). Mas você está correto ao afirmar que a descrição de uma versão específica de um pacote levaria a problemas com outros pacotes usando outras versões. Esse problema tem a ver com desenvolvedores npm, como os artigos afirmam
Portanto, os desenvolvedores devem seguir sempre para definir peerDependencies. Você deve abrir um problema para o pacote grunt-esteróides no GitHub ...
fonte
multiple versions of a package which would cause some issues
mas não é esse o objetivo de um gerenciador de pacotes? Eles discutem isso ainda mais no mesmo artigo, onde há duas versões do mesmo pacote no projeto: uma fornecida pelo desenvolvedor e outra fornecida por uma biblioteca de terceiros.winston
exemplo agora não consigo usar awinston-mail
biblioteca porque minha versão não corresponde à dependência de colegas? Eu preferiria ter esse downgrade temporário do mais recente e melhor para a biblioteca 1 do que não poder usá-lo.peerDependencies
explicado com o exemplo mais simples possível:executar a instalação do npm no myPackage gerará um erro porque está tentando instalar a versão React
^15.0.0
Efoo
que é compatível apenas com o React^16.0.0
.peerDependencies NÃO estão instalados.
fonte
foo
funcionar com o React 15 e o React 16, ele poderá listar sua Dependência par como>=15 < 17
.