Esta documentação responde muito mal à minha pergunta. Eu não entendi essas explicações. Alguém pode dizer em palavras mais simples? Talvez com exemplos, se é difícil escolher palavras simples?
EDIT também acrescentou peerDependencies
, que está intimamente relacionado e pode causar confusão.
optionalDependencies
agora.Respostas:
Resumo das diferenças importantes de comportamento:
dependencies
estão instalados em ambos:npm install
de um diretório que contémpackage.json
npm install $package
em qualquer outro diretóriodevDependencies
estamos:npm install
um diretório que contémpackage.json
, a menos que você passe a--production
bandeira (faça um voto positivo com a resposta de Gayan Charith ).npm install "$package"
nenhum outro diretório, a menos que você dê a--dev
opção.peerDependencies
:npm install
e você deverá resolver a dependência manualmente. Ao executar, se a dependência estiver ausente, você receberá um erro (mencionado por @nextgentech )Transitividade (mencionada por Ben Hutchison ):
dependencies
são instalados de forma transitória: se A requer B e B requer C, C é instalado; caso contrário, B não funcionaria e A.devDependencies
não está instalado transitivamente. Por exemplo, não precisamos testar B para testar A, para que as dependências de teste de B possam ser deixadas de fora.Opções relacionadas não discutidas aqui:
bundledDependencies
que é discutido na seguinte pergunta: Vantagens de bundledDependencies sobre dependências normais no NPMoptionalDependencies
(mencionado por Aidan Feldman )devDependencies
dependencies
são necessários para executar,devDependencies
apenas para desenvolver, por exemplo: testes de unidade, transpilação CoffeeScript para JavaScript, minificação, ...Se você estiver desenvolvendo um pacote, faça o download (por exemplo, via
git clone
), vá para a raiz que contémpackage.json
e execute:Como você possui a fonte real, é claro que deseja desenvolvê-la; portanto, por padrão, ambas
dependencies
(desde que você deve, é claro, executar para desenvolver) edevDependency
dependências também são instaladas.Se, no entanto, você é apenas um usuário final que deseja instalar um pacote para usá-lo, faça isso em qualquer diretório:
Nesse caso, você normalmente não querem que as dependências de desenvolvimento, assim você só recebe o que é necessário para utilizar o pacote:
dependencies
.Se você realmente deseja instalar pacotes de desenvolvimento nesse caso, pode definir a
dev
opção de configuração paratrue
, possivelmente na linha de comando, como:A opção é
false
por padrão, pois esse é um caso muito menos comum.peerDependencies
(Testado antes da 3.0)
Fonte: https://nodejs.org/en/blog/npm/peer-dependencies/
Com dependências regulares, você pode ter várias versões da dependência: ela é simplesmente instalada dentro
node_modules
da dependência.Por exemplo, se
dependency1
edependency2
ambos dependem dedependency3
versões diferentes, a árvore do projeto será semelhante a:Plugins, no entanto, são pacotes que normalmente não exigem o outro pacote, chamado de host neste contexto. Em vez de:
Por exemplo, se
dependency1
edependency2
ponto dependemdependency3
, a árvore do projeto será semelhante a:Isso acontece mesmo que você nunca mencione
dependency3
no seupackage.json
arquivo.Eu acho que essa é uma instância do padrão de design Inversion of Control .
Um exemplo prototípico de dependências entre pares é o Grunt, o host e seus plugins.
Por exemplo, em um plug-in Grunt como https://github.com/gruntjs/grunt-contrib-uglify , você verá que:
grunt
é umpeer-dependency
require('grunt')
está abaixotests/
: não é realmente usado pelo programa.Então, quando o usuário usar um plug-in, ele implicitamente exigirá o plug-in
Gruntfile
adicionando umagrunt.loadNpmTasks('grunt-contrib-uglify')
linha, mas égrunt
que o usuário chamará diretamente.Isso não funcionaria se cada plug-in exigisse uma versão diferente do Grunt.
Manual
Acho que a documentação responde muito bem à pergunta, talvez você não esteja familiarizado o suficiente com os gerenciadores de nós / outros pacotes. Eu provavelmente só entendo porque sei um pouco sobre o empacotador Ruby.
A linha principal é:
E então, em npm-config (7), localize
dev
:fonte
npm install package
um comando que você usaria para instalar todos os pacotes que não são dependências de desenvolvimento, e não o que agora acho que você quis dizer, que era 'instalar o pacote chamado [pacote]', que era como eu pensava que funcionava. antes de ler isso. Se eu fosse você, editaria para dizer [nome do pacote], o que mostra claramente que o que você quer dizer é 'inserir nome do aqui'.peerDependencies
comportamento alterado nas próximas npm @ 3. De blog.npmjs.org/post/110924823920/npm-weekly-5 : "Não baixaremos mais automaticamente a dependência de pares. Em vez disso, avisaremos se a dependência de pares ainda não estiver instalada. Isso exige que você resolver os conflitos de peerDependency manualmente, mas a longo prazo, isso deve tornar menos provável que você acabe em um ponto complicado com as dependências dos seus pacotes. "npm install
pacote A, obterá B e C, mas não D.devDependencies
não é instalado quandoNODE_ENV
está definido comoproduction
.Se você não deseja instalar o devDependencies, pode usar
npm install --production
fonte
--save
opção não é mais necessária. Se você "npm instalar o meu pacote", ele adicionará o meu pacote como uma dependência no seupackage.json
arquivo.Como exemplo, o mocha normalmente seria uma devDependency, pois o teste não é necessário na produção, enquanto o express seria uma dependência.
fonte
dependências
Dependências que seu projeto precisa executar, como uma biblioteca que fornece funções que você chama do seu código.
Eles são instalados de forma transitória (se A depende de B depende de C, a instalação npm em A instalará B e C).
Exemplo: lodash: seu projeto chama algumas funções de lodash.
devDependencies
Dependências necessárias apenas durante o desenvolvimento ou a liberação, como compiladores que pegam seu código e o compilam em javascript, estruturas de teste ou geradores de documentação.
Eles não são instalados de forma transitória (se A depende de B dev - depende de C, a instalação do npm em A instalará apenas B).
Exemplo: grunt: seu projeto usa o grunt para se construir.
peerDependencies
Dependências nas quais seu projeto se conecta ou modifica no projeto pai, geralmente um plug-in para alguma outra biblioteca ou ferramenta. Pretende-se apenas ser uma verificação, certificando-se de que o projeto pai (projeto que dependerá do seu projeto) tenha uma dependência do projeto no qual você está conectado. Portanto, se você criar um plug-in C que adiciona funcionalidade à biblioteca B, alguém que cria um projeto A precisará ter uma dependência de B se tiver uma dependência de C.
Eles não estão instalados (a menos que npm <3), são apenas verificado.
Exemplo: grunt: seu projeto adiciona funcionalidade ao grunt e só pode ser usado em projetos que usam o grunt.
Esta documentação explica muito bem as dependências entre pares: https://nodejs.org/en/blog/npm/peer-dependencies/
Além disso, a documentação do npm foi aprimorada ao longo do tempo e agora possui explicações melhores dos diferentes tipos de dependências: https://github.com/npm/cli/blob/latest/doc/files/package.json.md#devdependencies
fonte
Para salvar um pacote no package.json como dependências de dev:
Quando você executa
npm install
, instala ambosdevDependencies
edependencies
. Para evitar a instalação,devDependencies
execute:fonte
Existem alguns módulos e pacotes necessários apenas para o desenvolvimento, que não são necessários na produção. Como diz na documentação :
fonte
Uma explicação simples que me deixou mais claro é:
Quando você implanta seu aplicativo, os módulos nas dependências precisam ser instalados ou o aplicativo não funciona. Os módulos no devDependencies não precisam ser instalados no servidor de produção, pois você não está desenvolvendo nessa máquina. ligação
fonte
vendor.js
, todos os nossos deps devem ser dev deps se o código compilado for confirmado no repositório? E deve ser comprometida, como otherwice é estranho que você tem que compilar módulo, não basta instalá-lo (e teste também é em algum lugar aqui como qualquer mudança na submódulos pode levar à regressão) ...webpack -p
quero dizer. por favor responda minha pergunta.Gostaria de acrescentar à resposta minha opinião sobre essas dependências explicações
dependencies
são usados para uso direto em sua base de código, coisas que geralmente acabam no código de produção ou em pedaços de códigodevDependencies
são usados para o processo de criação, ferramentas que ajudam a gerenciar como o código final terminará, módulos de teste de terceiros, (por exemplo, material da webpack)fonte
Em resumo
Dependências -
npm install <package> --save-prod
instala pacotes exigidos pelo seu aplicativo no ambiente de produção.DevDependencies -
npm install <package> --save-dev
instala pacotes necessários apenas para desenvolvimento e teste localApenas digitar
npm install
instala todos os pacotes mencionados no package.jsonentão, se você estiver trabalhando no computador local, basta digitar
npm install
e continuar :)fonte
peerDependencies
não fazia muito sentido para mim até que li este trecho de um post no blog sobre o tópico mencionado por Ciro acima :O plugin espera uma versão específica do host ...
peerDependencies
são para plug-ins, bibliotecas que exigem uma biblioteca "host" para desempenhar suas funções, mas podem ter sido gravadas antes da versão mais recente do host.Isto é, se eu escrever
PluginX v1
paraHostLibraryX v3
e ir embora, não há nenhuma garantiaPluginX v1
funcionará quandoHostLibraryX v4
(ou mesmoHostLibraryX v3.0.1
) é liberado.... mas o plugin não depende do host ...
Do ponto de vista do plug-in, ele apenas adiciona funções à biblioteca host. Eu realmente não "preciso" do host para adicionar uma dependência a um plug-in, e os plug-ins geralmente não dependem literalmente do host. Se você não possui o host, o plug-in inofensivamente não faz nada.
Isso significa que
dependencies
não é realmente o conceito certo para plugins.Pior ainda, se meu host fosse tratado como uma dependência, acabaríamos nessa situação mencionada na mesma postagem do blog (editada um pouco para usar o host e o plugin compostos desta resposta):
... e o host obviamente não depende do plugin ...
... esse é o objetivo dos plugins. Agora, se o host fosse bom o suficiente para incluir informações de dependência para todos os seus plugins, isso resolveria o problema, mas também introduziria um enorme problema cultural novo : gerenciamento de plugins!
O ponto principal dos plug-ins é que eles podem emparelhar anonimamente. Em um mundo perfeito, ter o host gerenciando tudo seria limpo e arrumado, mas não precisaremos de bibliotecas que mantenham gatos.
Se não somos hierarquicamente dependentes, talvez sejamos colegas intradependentes ...
Em vez disso, temos o conceito de ser pares. Nem o host nem o plug-in ficam no balde de dependência do outro. Ambos vivem no mesmo nível do gráfico de dependência.
... mas este não é um relacionamento automatizável. <<< Moneyball !!!
Se eu sou
PluginX v1
e espero que um par de (ou seja, tenha uma dependência de par de )HostLibraryX v3
, eu direi. Se você atualizou automaticamente para aHostLibraryX v4
versão mais recente (observe a versão 4 ) E jáPlugin v1
instalou, você precisa saber, certo?npm
não pode gerenciar essa situação para mim -... ou ...
Que tal não, npm ?!
Então npm não. Ele alerta você para a situação e permite que você descubra se
HostLibraryX v4
é um parceiro adequadoPlugin v1
.Coda
Um bom
peerDependency
gerenciamento de plug-ins fará com que esse conceito funcione de forma mais intuitiva na prática. Da postagem do blog , mais uma vez ...fonte
Dependências vs dependências de desenvolvimento
As dependências do desenvolvedor são módulos necessários apenas durante o desenvolvimento, enquanto as dependências são necessárias no tempo de execução. Se você estiver implantando seu aplicativo, é necessário instalar dependências, caso contrário, seu aplicativo simplesmente não funcionará. Bibliotecas que você chama de seu código que permite a execução do programa podem ser consideradas dependências.
Por exemplo, reagir, reagir - dom
Os módulos de dependência de desenvolvimento não precisam ser instalados no servidor de produção, pois você não desenvolverá nessa máquina .compiladores que escondem seu código em javascript, estruturas de teste e geradores de documentos podem ser considerados dependências de desenvolvimento, pois são necessários apenas durante o desenvolvimento.
Por exemplo, ESLint, Babel, webpack
@PARA SUA INFORMAÇÃO,
Se você estiver publicando no npm, é importante usar o sinalizador correto para os módulos corretos. Se for necessário que o seu módulo npm funcione, use o sinalizador "--save" para salvar o módulo como uma dependência. Se é algo que seu módulo não precisa funcionar, mas é necessário para testar, use o sinalizador "--save-dev".
fonte
Ao tentar distribuir um pacote npm, você deve evitar o uso
dependencies
. Em vez disso, você deve considerar adicioná-lopeerDependencies
ou removê-lodependencies
.fonte
Eu encontrei uma explicação simples.
Resposta curta:
dependências "... são aquelas que o seu projeto realmente precisa para poder trabalhar na produção."
devDependencies "... são aqueles que você precisa durante o desenvolvimento."
peerDependencies "se você deseja criar e publicar sua própria biblioteca para que possa ser usada como uma dependência"
Mais detalhes nesta publicação: https://code-trotter.com/web/dependencies-vs-devdependencies-vs-peerdependencies
fonte