Qual é a diferença entre --save e --save-dev?


747

Qual é a diferença entre:

npm install [package_name] --save

e:

npm install [package_name] --save-dev

O que isto significa?


4
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.

150
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

npm install jasmine-core --save-dev
npm install karma --save-dev

Isso também criaria um novo valor no seu package.json

"devDependencies": {
    ...
    "jasmine-core": "^2.5.2",
    "karma": "^1.4.1",
}

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.

Obtido diretamente do NPM docs docs # dependencies

Dependências

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.

Espero que isso ajude e seja claro.


15
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

A documentação de instalação do npm pode ser consultada aqui.


37
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.


4
O mesmo vale para: "$ npm install grunt --save-dev", pois é útil para desenvolvimento, mas não para implantação.
Jackalope

1
Uma observação lateral: A Microsoft sugere a instalação de pacotes @ types / xxx como dependências, não devDependencies github.com/Microsoft/types-publisher/issues/81
Dave

2
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.


8
Muito melhor que a resposta aceita, bem como a resposta com o máximo de votos, pois essa resposta é de natureza mais prática. Obrigado!
Exceção não capturada

Essa deve ser a resposta escolhida. Todas as outras respostas não explicam realmente por que você usaria uma sobre a outra.
Rocky Kev

34

Conforme sugerido por @ andreas-hultgren nesta resposta e de acordo com os documentos da npm :

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.


3
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".


83
e qual é a diferença funcional?
ahnbizcad

6
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.

Consulte: https://docs.npmjs.com/cli/install


8

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).

npm install --save lodash       //prod dependency
npm install -S moment           // "       "
npm install -S opentracing      // "       "

npm install -D jest                 //dev only dependency
npm install --save-dev typescript   //dev only dependency

Se você abrir o package.jsonarquivo, verá essas entradas listadas em duas seções diferentes:

"dependencies": {
  "lodash": "4.x",
  "moment": "2.x",
  "opentracing": "^0.14.1"
},

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},

5

--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


3

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:

npm i --only=production

0

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 dependenciespara compilar


Se 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 --saveou--save-dependencies , apenas ele precisa émonaco-min.js

Resumo:

  1. Se alguém quiser compilar seus códigos (use como biblioteca), coloque o lodashque é usado pelos seus códigos emdependencies

  2. Se alguém quiser adicionar mais recursos aos seus códigos, ele precisa unit teste os compilercoloca emdev-dependencies


0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.