Sim, estou confuso sobre isso - se você usa a integração contínua como o Jenkins, o Jenkins sabe usar os módulos devDependencies para executar testes? Suponho que sim, mas não é super óbvio.
Alexander Mills
5
talvez edite a pergunta para dizer também, qual é a diferença funcional entre dependências e devDependencies?
Alexander Mills
5
Pacotes instalados através da opção --save-dev não são reinstalados quando o usuário executa npm install --production. Essa é a diferença operacional (consulte https://docs.npmjs.com/cli/install para obter mais informações).
20917 Andrew
7
@MuhammadUmer É exatamente por isso que as pessoas fazem perguntas aqui - para 'obter uma pista'. Talvez adicionar uma resposta real seja mais produtivo - essa é definitivamente uma distinção interessante da qual eu não estava ciente.
Simon_Weaver
3
Além disso, se você definir a variável de ambiente NODE_ENVcomo produção, npm installexclui automaticamente os pacotes de desenvolvimento.
Muhammad Umer 01/01
Respostas:
591
--save-devé usado para salvar o pacote para fins de desenvolvimento. Exemplo: testes de unidade, minificação.
--save é usado para salvar o pacote necessário para a execução do aplicativo.
Como eles são diferentes? Quando eu usaria um contra o outro? Ainda posso usar o pacote em produção se estiver sob --save-dev?
Dave Voyles
14
A resposta responde sucintamente às suas duas primeiras perguntas. A resposta para a última pergunta, "Ainda posso usar o pacote em produção se estiver sob --save-dev", é "não". Embora seja certamente possível fazer isso, não se destina.
Technetium
61
Taquigrafia versões: -Dé curto para --save-deve -Sé curto para--save
Chrisco
164
Essa resposta é frustrantemente vaga. Mesmo um pequeno exemplo ajudaria a tornar isso mais claro.
Choylton B. Higginbottom
33
Observe que a partir da versão 5.0.0 do npm, a --saveopção não é mais necessária. Se você fizer npm install my-packageisso, ele adicionará "my-package" como uma dependência no arquivo package.json.
Martin Carel
644
A diferença entre --savee --save-devpode não ser percebida imediatamente se você as tiver experimentado em seus próprios projetos. Então, aqui estão alguns exemplos ...
Digamos que você estava criando um aplicativo que usou o pacote momentâneo para analisar e exibir datas. Seu aplicativo é um agendador; portanto, ele realmente precisa que este pacote seja executado, como em: não pode ser executado sem ele . Nesse caso, você usaria
npm install moment --save
Isso criaria um novo valor no seu package.json
"dependencies":{..."moment":"^2.17.1"}
Quando você está desenvolvendo, realmente ajuda a usar ferramentas como suítes de teste e pode precisar de jasmim-core e carma . Nesse caso, você usaria
Você não precisa da suíte de testes para executar o aplicativo em seu estado normal; portanto, é uma --save-devdependência de tipo, nada mais. Você pode ver como, se você não entende o que realmente está acontecendo, é um pouco difícil de imaginar.
As dependências são especificadas em um objeto simples que mapeia um nome de pacote para um intervalo de versão. O intervalo de versão é uma sequência que possui um ou mais descritores separados por espaço. As dependências também podem ser identificadas com um URL tarball ou git.
Por favor, não coloque chicotes de teste ou transpilers em seu objeto de dependências. Veja devDependencies , abaixo.
Mesmo nos documentos, ele solicita que você use --save-dev para módulos como chicotes de teste.
OMI, acho que a palavra-chave 'salvar' é um problema. Por que eles não fazem sinalizador -dev para desenvolver e implantar para implantação. Faz sentido que a palavra-chave "salvar".
Thinh Vu
1
Por que o pacote simplesmente não sabe (decide) se é um pacote de lançamento ou de desenvolvimento e --save deve ser usado para ambos. Parece estranho fazer o usuário instalador decidir isso quando o desenvolvedor do pacote cria a intenção.
precisa saber é o seguinte
4
CodeGrue, se você usar o jQuery apenas para testar componentes do React, ele será salvo no save-dev, mas na verdade você não poderá usá-lo para criar seu projeto principal. Sim, isso é possível. Então, por que o empacotador saberia o que você está fazendo com ele?
Michael Bruce
2
Muito mais claro. Sou um cara incorporado aprendendo o fluxo de trabalho do Bootstra + Node.js pela primeira vez. Não é óbvio qual é a diferença.
precisa saber é o seguinte
3
@YakovL save-dev significa que os pacotes não são instalados quando alguém instala seu pacote como dependência. Pacotes que são usados apenas para executar scripts como start / build não serão necessários nesse caso, portanto, eles são colocados em dependências de desenvolvimento. Se você estiver trabalhando em um aplicativo Web e não em um pacote para uso de outras pessoas, provavelmente não deve se preocupar com isso.
riv
112
Por padrão, o NPM simplesmente instala um pacote em node_modules. Ao tentar instalar dependências para seu aplicativo / módulo, você precisa primeiro instalá-las e adicioná-las à dependenciesseção do seu package.json.
--save-devadiciona o pacote de terceiros às dependências de desenvolvimento do pacote. Não será instalado quando alguém instalar o seu pacote. Normalmente, ele é instalado apenas se alguém clona seu repositório de origem e executanpm install .
--saveadiciona o pacote de terceiros às dependências do pacote. Ele será instalado junto com o pacote sempre que alguém executarnpm install package .
Dependências de desenvolvimento são aquelas dependências necessárias apenas para o desenvolvimento do pacote. Isso pode incluir executores de teste, compiladores, empacotadores, etc. Ambos os tipos de dependências são armazenados no package.jsonarquivo do pacote . --saveadiciona a dependencies, --save-devadiciona adevDependencies
Eu suspeitava disso ... você pode usar --save-dev e --save de forma intercambiável se você criar um aplicativo da Web que não se tornará um pacote, ou seja, baixado do npm, se estiver desenvolvendo um pacote para compartilhar com outras pessoas, ele é importante entender a diferença.
VFein 31/03/19
13
Obrigado finalmente alguém que diz que seu objetivo quando você usar NPM instalar
CapturedTree
3
--save agora é o padrão com o npm install com o lançamento do npm 5 em 2017
NattyC 11/19/19
espera, por que frases complexas? No DevDependecy, o desenvolvedor pode instalar os pacotes e serão atualizados apenas o devDevependency. Portanto, quando o novo desenvolvedor clona a base de código do projeto e executa o npm install => aqui apenas dependency package name is going to install.no node_modules .. não no pacote do desenvolvedor, como na dependência do Dev.
Anupam Maurya
60
Um exemplo perfeito disso é:
$ npm install typescript --save-dev
Nesse caso, você deseja ter o Typecript (uma linguagem de codificação analisável por javascript) disponível para desenvolvimento, mas depois que o aplicativo é implantado, não é mais necessário, pois todo o código foi transpilado para javascript. Como tal, não faria sentido incluí-lo no aplicativo publicado. Na verdade, isso ocuparia apenas espaço e aumentaria o tempo de download.
O que acho confuso é como isso importa? Os pacotes salvos usando --saveainda são salvos apenas na node_modulespasta. O código não está incluído no site implantado.
Kokodoko
6
@Kokodoko Quando você usa a --save-devbandeira, o pacote é adicionado ao seu devDependenciesobjeto. Se / quando alguém instalar o seu pacote, todos dependenciesserão baixados, mas devDependenciesnão, pois não são necessários em tempo de execução. Como a resposta afirmou, isso economiza tempo e espaço. Os desenvolvedores que trabalham nos arquivos do pacote em si podem simplesmente executar npm installdentro do diretório do pacote para instalar o devDependenciestambém.
Jasjit Singh Marwah 18/03/19
Então, se você baixar um repositório do github e digitar npm install, eles devDependenciesserão ignorados?
Kokodoko 19/03/19
41
Deixe-me lhe dar um exemplo,
Você é desenvolvedor de uma biblioteca npm muito SÉRIA . Que usa diferentes bibliotecas de teste para testar o pacote.
Um usuário Baixou sua biblioteca e deseja usá-la em seu código. Eles também precisam baixar suas bibliotecas de teste? Talvez você use jestpara testar e eles usem mocha. Você quer que eles instalem jesttambém? Apenas para executar sua biblioteca?
Não, certo? É por isso que eles estãodevDependencies .
Quando alguém o faz, npm i yourPackageapenas as bibliotecas necessárias para EXECUTAR sua biblioteca serão instaladas. Outras bibliotecas usadas para agrupar seu código ou testes e zombarias não serão instaladas porque você as coloca emdevDependencies . Bem legal né?
Então, por que os desenvolvedores precisam expor os devDependancies ?
Digamos que seu pacote é um pacote de código aberto e centenas de pessoas estão enviando solicitações pull ao seu pacote. Então, como eles testarão o pacote? Eles serão git cloneseus repositórios e quando eles farão npm ias dependências e as devDependencies .
Porque eles não estão usando seu pacote. Eles estão desenvolvendo o pacote ainda mais, portanto, para testar seu pacote, eles precisam passar nos casos de teste existentes e escrever novos. Portanto, eles precisam usar o seu devDependenciesque contém todas as bibliotecas de teste / construção / zombaria que VOCÊ usou.
Se alguém estiver planejando baixar e usar seu módulo em seu programa, provavelmente não deseja ou precisa baixar e criar a estrutura de teste ou documentação externa que você usa.
No entanto, para o desenvolvimento de aplicativos da Web , o Yeoman (uma ferramenta de andaime que instala um arquivo package.json pré-escrito e revisado por pares, entre outras coisas) coloca todos os pacotes em devDependencies e nada em dependências; portanto, parece que o uso de --save-devé uma aposta segura no desenvolvimento de aplicativos da web , pelo menos.
Observe que eu tive problemas ao usar o gulp e instalar pacotes com os --save-devquais o pacote não instalaria suas dependências necessárias. A execução --saveinstalou essas dependências ausentes.
Nick M
18
Também gostaria de observar que agora estou usando apenas --savetodas as dependências de teste e documentação (conforme os documentos do npm). Estou começando a pensar que o exemplo Yeoman que mencionei acima não é um bom exemplo de boas práticas.
wayfarer_boy
Eu também penso assim, por que você nunca necessidade --save-devsó é cada vez menos clara, com cada resposta aqui :)
Kokodoko
20
--save-devsalva semver spec na matriz "devDependencies" no seu arquivo descritor de pacotes, e --savesalva em "dependencies".
Essa resposta faz mais sentido para mim, então as devDependencies são necessárias para o desenvolvimento, mas não para a produção, portanto htmllint, compilação sass etc.
miller the gorilla
3
@ahnbizcad Respondeu melhor aqui, mas a principal diferença funcional é que as devDependencies não são incluídas transitivamente.
Pace
Não é a maneira mais intuitiva de descrevê-lo para alguém que ainda não sabe, isso ?: O Dev --save-devtorna os pacotes locais para o seu projeto, enquanto --saveos locais para a instalação do nó?
ahnbizcad 8/09/16
9
Respostas claras já são fornecidas. Mas vale a pena mencionar como devDependenciesafeta a instalação de pacotes:
Por padrão, o npm install instalará todos os módulos listados como dependências no package.json. Com o sinalizador --production (ou quando a variável de ambiente NODE_ENV estiver definida como produção), o npm não instalará os módulos listados em devDependencies.
--save-dev é usado para módulos usados no desenvolvimento do aplicativo, não requerido durante a execução em ambiente de produção
--save é usado para adicioná-lo no package.json e é necessário para a execução do aplicativo.
Exemplo: express, body-parser, lodash, capacete, mysql, tudo isso é usado durante a execução do aplicativo --save para colocar dependências, enquanto mocha, istambul, chai, sonarqube-scanner são usados durante o desenvolvimento, então coloque aqueles em dev dependências.
O link npm ou npm install também instalará os módulos dev-dependency, juntamente com os módulos de dependência na pasta do projeto
Todas as explicações aqui são ótimas, mas faltam uma coisa muito importante: como você instala apenas dependências de produção? (sem as dependências de desenvolvimento). Separamos dependenciesa partir devDependenciesusando --saveou --save-dev. Para instalar tudo o que usamos:
npm i
Para instalar apenas pacotes de produção, devemos usar:
As pessoas usam o npm na produção para fazer coisas legais, o Node.js é um exemplo disso, então você não quer que todas as suas ferramentas de desenvolvimento sejam executadas.
Se você estiver usando gulp (ou similar) para criar arquivos de compilação para colocar no seu servidor, isso realmente não importa.
npm install --production
. Essa é a diferença operacional (consulte https://docs.npmjs.com/cli/install para obter mais informações).NODE_ENV
como produção,npm install
exclui automaticamente os pacotes de desenvolvimento.Respostas:
--save-dev
é usado para salvar o pacote para fins de desenvolvimento. Exemplo: testes de unidade, minificação.--save
é usado para salvar o pacote necessário para a execução do aplicativo.fonte
-D
é curto para--save-dev
e-S
é curto para--save
--save
opção não é mais necessária. Se você fizernpm install my-package
isso, ele adicionará "my-package" como uma dependência no arquivo package.json.A diferença entre
--save
e--save-dev
pode não ser percebida imediatamente se você as tiver experimentado em seus próprios projetos. Então, aqui estão alguns exemplos ...Digamos que você estava criando um aplicativo que usou o pacote momentâneo para analisar e exibir datas. Seu aplicativo é um agendador; portanto, ele realmente precisa que este pacote seja executado, como em: não pode ser executado sem ele . Nesse caso, você usaria
Isso criaria um novo valor no seu package.json
Quando você está desenvolvendo, realmente ajuda a usar ferramentas como suítes de teste e pode precisar de jasmim-core e carma . Nesse caso, você usaria
Isso também criaria um novo valor no seu package.json
Você não precisa da suíte de testes para executar o aplicativo em seu estado normal; portanto, é uma
--save-dev
dependência de tipo, nada mais. Você pode ver como, se você não entende o que realmente está acontecendo, é um pouco difícil de imaginar.Obtido diretamente do NPM docs docs # dependencies
Mesmo nos documentos, ele solicita que você use --save-dev para módulos como chicotes de teste.
Espero que isso ajude e seja claro.
fonte
Por padrão, o NPM simplesmente instala um pacote em node_modules. Ao tentar instalar dependências para seu aplicativo / módulo, você precisa primeiro instalá-las e adicioná-las à
dependencies
seção do seupackage.json
.--save-dev
adiciona o pacote de terceiros às dependências de desenvolvimento do pacote. Não será instalado quando alguém instalar o seu pacote. Normalmente, ele é instalado apenas se alguém clona seu repositório de origem e executanpm install
.--save
adiciona o pacote de terceiros às dependências do pacote. Ele será instalado junto com o pacote sempre que alguém executarnpm install package
.Dependências de desenvolvimento são aquelas dependências necessárias apenas para o desenvolvimento do pacote. Isso pode incluir executores de teste, compiladores, empacotadores, etc. Ambos os tipos de dependências são armazenados no
package.json
arquivo do pacote .--save
adiciona adependencies
,--save-dev
adiciona adevDependencies
A documentação de instalação do npm pode ser consultada aqui.
fonte
dependency package name is going to install.
no node_modules .. não no pacote do desenvolvedor, como na dependência do Dev.Um exemplo perfeito disso é:
Nesse caso, você deseja ter o Typecript (uma linguagem de codificação analisável por javascript) disponível para desenvolvimento, mas depois que o aplicativo é implantado, não é mais necessário, pois todo o código foi transpilado para javascript. Como tal, não faria sentido incluí-lo no aplicativo publicado. Na verdade, isso ocuparia apenas espaço e aumentaria o tempo de download.
fonte
--save
ainda são salvos apenas nanode_modules
pasta. O código não está incluído no site implantado.--save-dev
bandeira, o pacote é adicionado ao seudevDependencies
objeto. Se / quando alguém instalar o seu pacote, todosdependencies
serão baixados, masdevDependencies
não, pois não são necessários em tempo de execução. Como a resposta afirmou, isso economiza tempo e espaço. Os desenvolvedores que trabalham nos arquivos do pacote em si podem simplesmente executarnpm install
dentro do diretório do pacote para instalar odevDependencies
também.npm install
, elesdevDependencies
serão ignorados?Deixe-me lhe dar um exemplo,
jest
para testar e eles usemmocha
. Você quer que eles instalemjest
também? Apenas para executar sua biblioteca?Não, certo? É por isso que eles estão
devDependencies
.Quando alguém o faz,
npm i yourPackage
apenas as bibliotecas necessárias para EXECUTAR sua biblioteca serão instaladas. Outras bibliotecas usadas para agrupar seu código ou testes e zombarias não serão instaladas porque você as coloca emdevDependencies
. Bem legal né?Então, por que os desenvolvedores precisam expor os devDependancies ?
Digamos que seu pacote é um pacote de código aberto e centenas de pessoas estão enviando solicitações pull ao seu pacote. Então, como eles testarão o pacote? Eles serão
git clone
seus repositórios e quando eles farãonpm i
as dependências e as devDependencies .Porque eles não estão usando seu pacote. Eles estão desenvolvendo o pacote ainda mais, portanto, para testar seu pacote, eles precisam passar nos casos de teste existentes e escrever novos. Portanto, eles precisam usar o seu
devDependencies
que contém todas as bibliotecas de teste / construção / zombaria que VOCÊ usou.fonte
Conforme sugerido por @ andreas-hultgren nesta resposta e de acordo com os documentos da npm :
No entanto, para o desenvolvimento de aplicativos da Web , o Yeoman (uma ferramenta de andaime que instala um arquivo package.json pré-escrito e revisado por pares, entre outras coisas) coloca todos os pacotes em devDependencies e nada em dependências; portanto, parece que o uso de
--save-dev
é uma aposta segura no desenvolvimento de aplicativos da web , pelo menos.fonte
--save-dev
quais o pacote não instalaria suas dependências necessárias. A execução--save
instalou essas dependências ausentes.--save
todas as dependências de teste e documentação (conforme os documentos do npm). Estou começando a pensar que o exemplo Yeoman que mencionei acima não é um bom exemplo de boas práticas.--save-dev
só é cada vez menos clara, com cada resposta aqui :)--save-dev
salva semver spec na matriz "devDependencies" no seu arquivo descritor de pacotes, e--save
salva em "dependencies".fonte
--save-dev
torna os pacotes locais para o seu projeto, enquanto--save
os locais para a instalação do nó?Respostas claras já são fornecidas. Mas vale a pena mencionar como
devDependencies
afeta a instalação de pacotes:Consulte: https://docs.npmjs.com/cli/install
fonte
Geralmente, você não deseja inchar o pacote de produção com coisas que apenas pretende usar para fins de desenvolvimento.
Use a opção
--save-dev
(ou-D
) para separar pacotes, como estruturas de teste de unidade (jest, jasmim, mocha, chai, etc.)Quaisquer outros pacotes que seu aplicativo precise para Produção devem ser instalados usando
--save
(ou-S
).Se você abrir o
package.json
arquivo, verá essas entradas listadas em duas seções diferentes:fonte
--save-dev é usado para módulos usados no desenvolvimento do aplicativo, não requerido durante a execução em ambiente de produção --save é usado para adicioná-lo no package.json e é necessário para a execução do aplicativo.
Exemplo: express, body-parser, lodash, capacete, mysql, tudo isso é usado durante a execução do aplicativo --save para colocar dependências, enquanto mocha, istambul, chai, sonarqube-scanner são usados durante o desenvolvimento, então coloque aqueles em dev dependências.
O link npm ou npm install também instalará os módulos dev-dependency, juntamente com os módulos de dependência na pasta do projeto
fonte
Todas as explicações aqui são ótimas, mas faltam uma coisa muito importante: como você instala apenas dependências de produção? (sem as dependências de desenvolvimento). Separamos
dependencies
a partirdevDependencies
usando--save
ou--save-dev
. Para instalar tudo o que usamos:Para instalar apenas pacotes de produção, devemos usar:
fonte
Eu quero adicionar algumas das minhas idéias como
Eu acho que todos os diferentes aparecerão quando alguém usar seus códigos em vez de usar sozinho
Por exemplo, você escreve uma biblioteca HTTP chamada
node's request
Na sua biblioteca,
você usou o lodash para manipular string e objeto, sem o lodash, seus códigos não podem ser executados
Se alguém usar sua biblioteca HTTP como parte de seus códigos. Seus códigos serão compilados com os dele.
seus códigos precisam do lodash, então você precisa colocar
dependencies
para compilarSe você escrever um projeto como
monaco-editor
, que é um editor da Web,você agrupou todos os seus códigos e seus
product env library
agrupa usa o webpack, quando a compilação é concluída, possui apenas ummonaco-min.js
Então, alguém não caso se
--save
ou--save-dependencies
, apenas ele precisa émonaco-min.js
Resumo:
Se alguém quiser compilar seus códigos (use como biblioteca), coloque o
lodash
que é usado pelos seus códigos emdependencies
Se alguém quiser adicionar mais recursos aos seus códigos, ele precisa
unit test
e oscompiler
coloca emdev-dependencies
fonte
As pessoas usam o npm na produção para fazer coisas legais, o Node.js é um exemplo disso, então você não quer que todas as suas ferramentas de desenvolvimento sejam executadas.
Se você estiver usando gulp (ou similar) para criar arquivos de compilação para colocar no seu servidor, isso realmente não importa.
fonte