Como posso definir NODE_ENV = produção no Windows?

340

No Ubuntu, é bastante simples; Eu posso executar o aplicativo usando:

$ NODE_ENV=production node myapp/app.js

No entanto, isso não funciona no Windows. Existe um arquivo de configuração onde eu possa definir o atributo?

Jack
fonte
Para uma solução multiplataforma, você pode encontrar a resposta stackoverflow.com/a/57509175/11127383
Daniel Danielecki

Respostas:

485

As versões atuais do Windows usam o Powershell como o shell padrão; portanto, use:

$env:NODE_ENV="production"

Por resposta de @ jsalonen abaixo. Se você estiver no CMD (que não é mais mantido), use

set NODE_ENV=production

Isso deve ser executado no prompt de comando em que você pretende executar o aplicativo Node.js.

A linha acima definiria a variável de ambiente NODE_ENV para o prompt de comandos em que você executa o comando.

Para definir variáveis ​​de ambiente globalmente para que elas persistam além do prompt de comando único, você pode encontrar a ferramenta no Sistema no Painel de Controle (ou digitando 'ambiente' na caixa de pesquisa no menu Iniciar).

Jani Hartikainen
fonte
112
Para quem ainda está lutando com isso: set NODE_ENV=production && node app. Mais convenientemente configurar o seu package.jsonacordo: "scripts": { "start": "set NODE_ENV=production && node app" }.
Amberlamps
5
@ShuruiLiu o comando não produzirá nada, mas você pode digitar echo %NODE_ENV%para verificar seu valor atual.
Jani Hartikainen
169
Atenção: "set NODE_ENV = production &&" adiciona um espaço à direita na variável. Eu precisava "set NODE_ENV = production &&" para evitar o espaço adicional que quebra os aplicativos de nó como o Ghost.
daw 15/05
12
@ Amberlamps que não é uma boa solução porque o NODE_ENV é então apenas codificado para todas as máquinas; o objetivo real é alterar o env pela máquina usando uma variável env ou passar o valor na linha de comando, não codificá-lo no arquivo package.json.
Alexander Mills
6
Acho que usar cross-envé a melhor solução para esse problema se sua equipe trabalha em sistemas operacionais mistos. A resposta do @MoOx seria a minha escolha como resposta a esta pergunta.
philk
229

Acabei de encontrar um bom pacote Node.js. que pode ajudar muito a definir variáveis ​​de ambiente usando uma sintaxe única, plataforma cruzada.

https://www.npmjs.com/package/cross-env

Permite escrever algo como isto:

cross-env NODE_ENV=production my-command

O que é bastante conveniente! Não há mais comandos específicos para Windows ou Unix!

MoOx
fonte
25
Enquanto a primeira resposta for verdadeira. Eu acho que esta resposta é mais confiável e deve ser usado
d4rklit3
Esta é uma otima soluçao!
Kirill Gusyatin
Simples e resolve perfeitamente o meu problema. Consegui construir apenas no Linux. Isso resolveu o Linux e o Windows.
precisa saber é o seguinte
Essa resposta merece mais amor, deve ser o único aceite :)
Honza Kalfus
Esta é a melhor resposta para mim também
knaos
166

No PowerShell:

$env:NODE_ENV="production"
jsalonen
fonte
4
ps: não se esqueça do $ e das aspas;) #
George George
6
set NODE_ENV=productionnão funcionou para mim no PowerShell, mas isso funcionou. Obrigado!
raiva
6
Lutou um pouco para que isso funcionasse no Powershell no Visual Studio Code. Pensei em deixar a solução aqui. Eu estava tentando executar um comando "Gulp", garantindo o valor correto do env. Isto é o que acabou funcionando para mim: $env:NODE_ENV="development"; gulp runMytask. Observe o ponto e vírgula lá. O arquivo gulp pode usar lógica condicional em process.env.NODE_ENV. A menos que você o defina, ele será indefinido.
dvsoukup 28/09
2
Só esta solução trabalho para mim com janelas 10 e Webpack 3.8.1
Роман Арсеньев
11
Isso funciona perfeito. Mas, a cross-env NODE_ENV=productionopção é realmente uma solução melhor se estiver executando comandos npm do package.json que exigem que o ambiente seja definido. É muito fácil deixar o env definido no dev / prod depois de usar a opção $ env: NODE_ENV
Drenai
105

Seria ideal se você pudesse definir parâmetros na mesma linha que sua chamada para iniciar o Node.js no Windows. Observe o seguinte com cuidado e execute-o exatamente como indicado:

Você tem estas duas opções:

  1. Na linha de comando:

    set NODE_ENV=production&&npm start

    ou

    set NODE_ENV=production&&node index.js
  2. O truque para que ele funcione no Windows é que você precisa remover o espaço em branco antes e depois do "&&". Configure seu arquivo package.json com start_windows (veja abaixo) abaixo. Em seguida, execute "npm run start_windows" na linha de comando.

    //package.json
    
    "scripts": {
      "start": "node index.js"
      "start_windows": "set NODE_ENV=production&&node index.js"
    }
Alexander Mills
fonte
11
A DEF gostaria de saber como fazê-lo funcionar dessa maneira.
SC_Chupacabra
2
Trabalhou para mim. Tinha que remover o espaço em branco que "set NODE_ENV = produção && nodemon server.js"
SC_Chupacabra
2
Gostaria de ter lido até aqui antes de tentar a resposta acima, teria me poupado algum tempo. : \
Jeff
11
Em uma nota vagamente relacionada, descobri que o && não funcionava como esperado no Windows ao encadear vários comandos. Em caso de dúvida, tente usar | em vez disso
Mike
11
isso funcionou para mim no Windows 10 máquina de 64 bits do cmd e power-shell
Ani
30

Você pode usar

npm run env NODE_ENV=production

É provavelmente a melhor maneira de fazê-lo, porque é compatível com Windows e Unix.

Na documentação do script de execução npm :

O script env é um comando interno especial que pode ser usado para listar variáveis ​​de ambiente que estarão disponíveis para o script em tempo de execução. Se um comando "env" for definido no seu pacote, ele terá precedência sobre o built-in.

Brieuc P
fonte
3
Como podemos executar outro comando com o conjunto de variáveis? Isso não parece funcionar: npm run env NODE_ENV = produção && echo $ NODE_ENV. Provavelmente eles são executados em duas conchas diferentes?
Jonas Kello
11
Pelo que posso ver, isso não funciona. A partir dos documentos em si, ele apenas lista variáveis ​​de ambiente, não as define.
kumarharsh
2
Nao funciona para mim. Ele lista vars, mostram a var você especificar, mas em tempo de execução, var não é ok em process.env.YOUR_VAR ...
MoOx
3
@JonasKello Você usaria isto: npm run env NODE_ENV=production -- node -e 'console.log(process.env.NODE_ENV)'O --é obrigatório . Substitua node -e 'console.log(process.env.NODE_ENV)'pelo comando que desejar.
Pauan 20/10/16
Tentei isso com este comando: npm run env NODE_TLS_REJECT_UNAUTHORIZED=0 -- node --inspect ./etc/http-req-standalone.jse ... nada aconteceu. Não tenho certeza se esse método funciona no Windows.
Jcollum 19/07
14

Se você estiver usando o Visual Studio com NTVS, poderá definir as variáveis ​​de ambiente na página de propriedades do projeto:

Propriedades do projeto Visual Studio NTVS

Como você pode ver, os menus suspensos Configuração e plataforma estão desabilitados (não estudei muito o motivo disso), mas se você editar seu .njsprojarquivo da seguinte maneira:

  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DebugSymbols>true</DebugSymbols>
    <Environment>NODE_ENV=development</Environment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
    <DebugSymbols>true</DebugSymbols>
    <Environment>NODE_ENV=production</Environment>
  </PropertyGroup>

O menu suspenso 'Debug / Release' controlará como a variável é definida antes de iniciar o Node.js.

Paulo
fonte
12

Eu escrevi um módulo win-node-env com o qual você pode executar seu comando como faria no * nix.

NODE_ENV=production node myapp/app.js

Ele funciona criando um NODE_ENV.cmdque define a NODE_ENVvariável de ambiente e gera um processo filho com o restante do comando e seus argumentos.

Basta instalá-lo (globalmente) e executar seus comandos de script npm, ele deve fazê-los funcionar automaticamente.

npm install -g win-node-env
atraso
fonte
Exatamente o que eu estava procurando! para rodar com scripts npm, e até funciona com outras ferramentas de cli do nó, como o gracejo. Assim, "set NODE_ENV = depuração e cls e brincadeira ..." se tornou "cls & NODE_ENV = debug brincadeira"
Z. Khullah
9

Minha experiência usando o Node.js no Windows 7 de 64 bits no Visual Studio 2013 é que você precisa usar

setx NODE_ENV development

de uma janela cmd. E você precisa reiniciar o Visual Studio para que o novo valor seja reconhecido.

A sintaxe do conjunto dura apenas a duração da janela do cmd em que está configurada.

Teste simples no Node.js:

console.log('process.env.NODE_ENV = ' + process.env.NODE_ENV);

Ele retorna 'indefinido' ao usar set e retornará 'development' se estiver usando setx e reiniciando o Visual Studio.

Edhubbell
fonte
cmd- não PowerShell? Ugh, venha pelas janelas, junte-se.
Jcollum 19/07
sua observação sobre o reinício do código VS foi realmente útil!
Yury Kozlov
8

Aqui está o método de linha de não-comando:

No Windows 7 ou 10, digite environment na caixa de pesquisa do menu Iniciar e selecione Editar as variáveis ​​de ambiente do sistema.

Como alternativa, navegue até Painel de controle \ Sistema e segurança \ Sistema e clique em Configurações avançadas do sistema

Isso deve abrir a caixa de diálogo Propriedades do sistema com a guia Avançado selecionada. Na parte inferior, você verá um botão Variáveis ​​de ambiente ... Clique aqui.

Caixa de diálogo Sistema

A caixa de diálogo Variáveis ​​de ambiente será aberta.

Caixa de diálogo Variável de ambiente

Na parte inferior, em Variáveis ​​do sistema, selecione Novo ... Isso abrirá a caixa de diálogo Nova variável do sistema.

insira a descrição da imagem aqui

Digite o nome e o valor da variável e clique em OK.

Você precisará fechar todos os prompts do cmd e reiniciar o servidor para que a nova variável esteja disponível para process.env. Se ele ainda não aparecer, reinicie sua máquina.

Mattatat-tat
fonte
2
Obrigado! Eu tinha feito tudo isso, mas não estava funcionando até reiniciar o servidor.
Marcel Lamothe
7

Só para esclarecer, e para qualquer outra pessoa que possa estar arrancando os cabelos ...

Se você estiver usando o git bash no Windows , set node_env=production&& node whatever.js isso parece não funcionar . Em vez disso, use o cmd nativo. Em seguida, usar set node_env=production&& node whatever.jsfunciona como esperado.

Meu caso de uso:

Desenvolvo no Windows porque meu fluxo de trabalho é muito mais rápido, mas eu precisava garantir que o middleware específico do desenvolvimento do meu aplicativo não estivesse disparando no ambiente de produção.

pstrawberriedev
fonte
6

Para executar seu aplicativo no PowerShell (uma vez que &&não é permitido):

($env:NODE_ENV="production") -and (node myapp/app.js)

Observe que a saída de texto do que o servidor está fazendo é suprimida e não tenho certeza se isso pode ser corrigido. (Expandindo a resposta de @ jsalonen.)

Cameron Yick
fonte
Não funcionou para mim:"debug-windows": "($env:NODE_ENV=\"dev\") -and (node src/dequeue.js)"
Evandro Pomatti
4

primeiro no tipo powershell

$env:NODE_ENV="production"

então digite

node fileName.js

Funcionará perfeitamente exibindo todas as saídas.

Abhinav
fonte
2

Para várias variáveis ​​de ambiente, um .envarquivo é mais conveniente:

# .env.example, committed to repo
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
# .env, private, .gitignore it
DB_HOST=real-hostname.example.com
DB_USER=real-user-name
DB_PASS=REAL_PASSWORD

É fácil de usar com dotenv-safe:

  1. Instale com npm install --save dotenv-safe.
  2. Inclua-o no seu código (melhor no início do index.js) e use-o diretamente com o process.envcomando :
require('dotenv').load()
console.log(process.env.DB_HOST)   

Não se esqueça de ignorar o .envarquivo no seu VCS .

Seu programa falhará rapidamente se uma variável "definida" em .env.examplenão estiver configurada como variável de ambiente ou em .env.

Dominik
fonte
Os arquivos .env são convenientes apenas para segredos e adicionam uma etapa extra de complexidade ao configurar ao atribuir novas pessoas a um projeto ou aplicar alterações a elas.
Coiso
@coiso Sem um lugar comum e genérico, onde você coloca muitas variáveis ​​env? Em um arquivo de script ou em uma configuração dependente do IDE, você fica ainda mais vinculado a ferramentas específicas. Isso torna a integração de novos membros da equipe ainda mais difícil, eu acho.
Dominik
2

Caso você esteja usando o terminal GITBASH "set NODE_ENV=production" não funcione, o que você pode fazer é digitar "exportNODE_ENV=production"

Bozhinovski
fonte
0

isso não definirá uma variável, mas é útil em muitos casos. Não recomendarei usar isso para produção, mas tudo bem se você estiver brincando com o npm.

npm install --production
Bar Horing
fonte
0

Eu usei o script npm para executar uma tarefa gulp sem "&&"

NODE_ENV = casos de teste npm run seed-db

Mari Orlova
fonte
0

Reinicie o código VS se o NODE_ENV ou qualquer outra variável de ambiente não estiver fornecendo o valor correto. Isso deve funcionar após a reinicialização.

Rakesh Pahuja
fonte