Como você evita a instalação dos módulos NPM “devDependencies” para Node.js. (package.json)?

588

Eu tenho isso no meu arquivo package.json (versão reduzida):

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

Estou usando o NPM versão 1.1.1 no Mac 10.6.8.

Quando executo o seguinte comando a partir da raiz do projeto, ele instala o dependencies e devDependencies :

npm install

Fiquei com a impressão de que este comando instalou o devDependencies:

npm install --dev

Como faço para npm installinstalar apenas dependencies(o ambiente de produção recebe apenas esses módulos), enquanto algo como npm install --devinstala tanto dependenciese devDependencies?

Lance Pollard
fonte
1
De acordo com o documento, você está certo, o --dev instala o devdeps, caso contrário, apenas os deps. npmjs.org/doc/json.html . Eu sei que isso funciona para pacotes nomeados, pelo menos.
mna
1
se você se deparar com esta pergunta em 2015, a opção --save-dev faz o truque exatamente como solicitado nesta pergunta.
Anand
1
Esta resposta stackoverflow.com/a/22004559/3718119 dá uma boa explicação para as diferenças entre dependenciese devDependenciese quando cada um deles é usado.
quasoft 11/11/15

Respostas:

844

O npm installcomando instalará o devDependenciesalong other dependenciesquando executado dentro de um diretório de pacotes, em um ambiente de desenvolvimento (o padrão).

Use npm install --only=prod(ou --only=production) para instalar apenas dependencies e não devDependencies,independentemente do valor da NODE_ENVvariável de ambiente.

Fonte: npm docs

Nota: Antes da v3.3.0 da npm (13/08/2015), a opção era chamada --production, ou seja npm install --production.

Rohan Singh
fonte
2
O raciocínio do Agate é provavelmente remover o devDependencies, para que os consumidores que instalam seu pacote npm install yourpackage.tgztambém não obtenham o devDependencies. No entanto, esse já é o caso. Veja a resposta de Kevin Cox abaixo ( stackoverflow.com/a/15826602/825588 ).
Johann
5
npmjs.org/doc/cli/npm-install.html "Por padrão, o npm install instalará todos os módulos listados como dependências. Com o sinalizador --production, o npm não instalará os módulos listados em devDependencies."
tomByrer
14
Oh meu Deus. Eu tinha totalmente NODE_ENV=productionde outra coisa que estava fazendo e não conseguia descobrir por toda a minha vida por npm installque não instalaria dependências. Obrigado pela resposta completa.
aendrew 5/05
1
npm install --dev só iria instalar dependências dev
Rustem K
10
Para o npm 3.3 e seguintes: npm WARN install O uso da --devopção está obsoleto. Use em --only=devvez disso.
srcspider
232

Eu também encontro esse problema! A instalação do npm é um pouco confusa e as postagens na web continuam exibindo os sinalizadores -d / - dev como se houvesse um modo de instalação explícito para 'desenvolvimento'.

  • npm installinstalará " dependências " e " devDependencies "

  • npm install --productioninstalará apenas " dependências "

  • npm install --devinstalará apenas " devDependencies "

smertrios
fonte
29
AVISO: Se NODE_ENVestiver definido como productione você o executar npm install, não instalará dependências de desenvolvimento. Encontrei esse problema no meu Dockerfile.
Vaughan
1
@vaughan eu correr em isso também, pode ser resolvido através da execução npm --production=false install(embora não tenho certeza se isso vai funcionar ao lado da bandeira --dev)
Bavell
138

A nova opção é:

npm install --only=prod

Se você deseja instalar apenas devDependencies:

npm install --only=dev
Cloxure
fonte
1
Isso responde o oposto da pergunta. O OP está perguntando como NÃO instalar o devDependencies.
precisa saber é o seguinte
2
você está parcialmente correto no @ musicin3d, é por isso que na primeira parte eu respondi como instalar dependências apenas de produtos e na segunda parte como instalar dependências apenas de desenvolvedores, apenas por precaução.
Cloxure
5
Olá. Deixei esse comentário antes de @ user1614572 adicionar a parte sobre --only=prod. Você, senhor, está parcialmente correto. ; P
musicin3d
podemos incluir dependência separada para a implantação?
Jeeva Jsb
1
É um comentário, não uma resposta. Não vou checar todos os meus comentários periodicamente. Nunca vi pessoas atualizando comentários de anos atrás. Você basicamente veio aqui para criticar que eu coloquei um ano no meu comentário. Eu não vou responder mais. Divirta-se trollando outras pessoas.
Jacques #
47

Se você leu este POST em 2016, alcance o que deseja usando

--only={prod[uction]|dev[elopment]} 

O argumento fará com que apenas devDependencies ou non-devDependencies sejam instalados, independentemente do NODE_ENV.

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

wzr1337
fonte
Por que capitalizar o "POST"? docs.npmjs.com/cli/install documenta claramente AMBOS --productione --only={prod[uction]|dev[elopment]}.
Dan Dascalescu
33

Se você já instalou todas as suas dependências e deseja evitar o download dos pacotes de produção do NPM novamente, basta digitar:

npm prune --production

Isso removerá as dependências de desenvolvimento da sua node_modulespasta, o que é útil se você estiver tentando automatizar um processo em duas etapas, como

  1. Webpack meu projeto, usando dependências de desenvolvimento
  2. Criar uma imagem do Docker usando apenas módulos de produção

Correndo npm pruneentre você vai evitar que você precise reinstalar tudo!

piercebot
fonte
19

Ao usar "npm install", os módulos são carregados e disponibilizados em todo o aplicativo, independentemente de serem "devDependencies" ou "dependencies". Soma desta idéia: tudo o que seu package.json define como uma dependência (qualquer tipo) é instalado em node_modules.

O objetivo da diferença entre dependências / devDependencies / optionalDependencies é o que os consumidores do seu código podem fazer com o w / npm para instalar esses recursos.

De acordo com a documentação: https://npmjs.org/doc/json.html ...

Se alguém planeja fazer o download e usar o seu módulo em seu programa, provavelmente não deseja ou precisa fazer o download e criar a estrutura de teste ou documentação externa que você usa.

Nesse caso, é melhor listar esses itens adicionais em um hash devDependencies.

Essas coisas serão instaladas sempre que o sinalizador de configuração --dev for definido. Esse sinalizador é definido automaticamente ao fazer o link do npm ou ao instalar o npm a partir da raiz de um pacote e pode ser gerenciado como qualquer outro parâmetro de configuração do npm. Veja config (1) para mais informações sobre o tópico.

No entanto, para resolver esta questão, se você deseja instalar SOMENTE as "dependências" usando o npm, o seguinte comando é:

npm install --production

Isso pode ser confirmado observando a confirmação do Git que adicionou esse filtro (junto com outros filtros [listados abaixo] para fornecer essa funcionalidade).

Filtros alternativos que podem ser usados ​​pelo npm:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors

@dmarr tente usar o npm install --production

creatovisguru
fonte
16

O npm instalará dependências de desenvolvimento ao instalar de dentro de um pacote (se houver um package.jsonno diretório atual). Se for de outro local (registro npm, git repo, local diferente no sistema de arquivos), ele instala apenas as dependências.

Kevin Cox
fonte
Você poderia reformular? Eu acho que você cometeu um erro entre parênteses, acho que você esqueceu de fechá-lo mais cedo e sua frase não faz muito sentido para mim (falante de inglês não-nativo). O comentário de Johann sob a resposta de Rohan Singh me levou a olhar para a sua resposta (porque minha dúvida era exatamente a mesma que a dúvida de ágata) e sem sucesso. Ainda não entendi como npm install some-modulenão instalará as dependências de dev some-module.
Rafael Eyng
Obrigado, consertado. No entanto, não entendo o resto da sua pergunta.
Kevin Cox
3

Descobri que, ao tentar instalar dependências de desenvolvimento para um pacote que contém um addon de nó, não é possível evitar a criação do addon ao executar o npm install --dev, mesmo que você queira apenas instalar o devDependencies. Então, eu tive que dar a volta nas costas da NPM:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

Ou, melhor (e de forma mais sucinta) ainda,

node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install
Gabriel Schulhof
fonte
3

Use npm install packageName --saveisso adicionará o pacote nas dependências , se você usar, npm install packageName --save-deventão devDependencies .

npm install packageName --save-devdeve ser usado para adicionar pacotes para fins de desenvolvimento. Como adicionar pacotes TDD (Chai, mocha, etc). Que são usados ​​no desenvolvimento e não na produção.

Sandip Nirmal
fonte
O OP não está tendo um problema ao salvar dependências, package.jsonmas uma vez que essas dependências já foram salvas , como coagir npma instalar apenas um tipo específico de dependência. Quando li sua resposta aqui, não aprendi nada que ajude a resolver o problema colocado pelo OP.
Louis
3

Vale ressaltar que você pode usar a NODE_ENVvariável de ambiente para obter o mesmo resultado. Particularmente útil se você estiver contenha seu aplicativo Node (por exemplo, Docker).

NODE_ENV=production npm install

O código acima instalará todas as suas dependências, exceto as dev (ie devDependencies).

se você precisar usar variáveis ​​de ambiente em Dockerfilemais informações, consulte aqui .

As variáveis ​​de ambiente são fáceis de sobrescrever sempre que necessário (por exemplo, se você deseja executar sua suíte de testes, digamos no Travis CI). Se fosse esse o caso, você poderia fazer algo assim:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

Documentação do NPM aqui

Produção

  • Padrão: false
  • Tipo: Booleano Defina como true para executar no modo "produção".

    1. O devDependencies não é instalado no nível mais alto ao executar a instalação local do npm sem argumentos.
    2. Defina NODE_ENV = "produção" para scripts de ciclo de vida.

Contêinerização feliz =)

Francesco Casula
fonte
3

Eu sugiro usar npm ci. Se você deseja instalar apenas pacotes necessários à produção (como você escreveu - sem devDependencies), então:

npm ci --only=production

ou

NODE_ENV=production npm ci

Se você prefere a velha escola npm install:

npm install --production

ou

NODE_ENV=production npm install

Aqui está uma boa resposta por que você deve usar npm ci.

marverix
fonte
Legal, ele também funciona npm ci, não apenas npm install!
Klesun
2

Precisa adicionar a resposta escolhida: A partir de agora, npm installem um diretório de pacote (contendo package.json) instalará o devDependencies, enquanto npm install -gnão os instalará.

ack
fonte
7
Sim, -gnão instala devDependencies, mas instala os pacotes globalmente, o que geralmente não é o resultado pretendido.
Bardi Harborow
0

npm install --productioné a maneira correta de instalar módulos de nó que são necessários para a produção. Verifique a documentação para mais detalhes

Rubin bhandari
fonte
-1

Agora há um problema, se você tiver o package-lock.json com o npm 5+. Você deve removê-lo antes de usar npm install --production.

Erich Stark
fonte
-1
npm install --dev will install dev dependencies

E, conforme a pergunta para instalar apenas dependências, o seguinte comando ajudará

npm install --prod will install dependencies
karthiks416
fonte