Como definir algumas variáveis de ambiente de dentro package.json
para serem usadas com npm start
comandos semelhantes?
Aqui está o que eu tenho atualmente no meu package.json
:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
Eu quero definir variáveis de ambiente (como NODE_ENV
) no script de inicialização enquanto ainda consigo iniciar o aplicativo com apenas um comando npm start
,.
node.js
npm
package.json
npm-scripts
dev.meghraj
fonte
fonte
Respostas:
Defina a variável de ambiente no comando de script:
Em seguida, use
process.env.NODE_ENV
no seu aplicativo.Nota:
env
garante que ele funcione entre plataformas. Você pode omitir se você se importa apenas com Mac / Linux.fonte
set NODE_ENV=test&& mocha --reporter spec
- não há espaço entre o teste e && de propósito."test": "NODE_ENV=test mocha --reporter spec"
não funcionará em sistemas Windows.env NODE_ENV=test mocha --reporter spec
usará a variável de ambiente declarada de maneira nativa entre plataformas, mas a chave é que ela é usada pelo npm de maneira ad hoc e única, apenas para a execução do script npm. (Não está definido ou exportado para referência futura.) Desde que você esteja executando seu comando a partir do script npm, não há problema. Além disso, o "&&" deve ser removido ao fazê-lo dessa maneira.Basta usar o pacote NPM entre env . Super fácil. Funciona em Windows, Linux e todos os ambientes. Observe que você não usa && para passar para a próxima tarefa. Você acabou de definir o ambiente e depois iniciar a próxima tarefa. Os nossos agradecimentos a @mikekidder pela sugestão em um dos comentários aqui.
Da documentação:
Observe que se você deseja definir vários vars globais, basta indicá-los em sucessão, seguidos pelo seu comando a ser executado.
Por fim, o comando que é executado (usando spawn) é:
A
NODE_ENV
variável de ambiente será definida por ambientefonte
"test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"
env
oucross-env
? Por um lado, o env não exige que eu instale nada e, por outro lado,cross-env
é mais popular. Alguém pode confirmar seenv
funciona em todas as plataformas?env
não funciona como está em todas as plataformas, daí a razão decross-env
existir. Basta usarcross-env
e terminar com isso.Como geralmente trabalho com várias variáveis de ambiente, acho útil mantê-las em um
.env
arquivo separado (ignore isso no controle de origem).Em seguida, inclua
export $(cat .env | xargs) &&
antes do seu comando de script.Exemplo:
Para um teste, você pode visualizar as variáveis env executando
npm run env
(linux) ounpm run env-windows
(windows).fonte
&&
para que ele funcionasse - Se você tiver vários arquivos .env, pode ser um pouco mais difícil de manter Sua resposta me inspirou a preparar esta sugestão: stackoverflow.com/questions/25112510/…Eu só queria adicionar meus dois centavos aqui para futuros exploradores de nós. No meu Ubuntu 14.04 o
NODE_ENV=test
não funcionou, eu tive que usarexport NODE_ENV=test
depois do qualNODE_ENV=test
comecei a trabalhar também, estranho.No Windows, como já foi dito, você deve usar,
set NODE_ENV=test
mas para uma solução de plataforma cruzada, a biblioteca entre ambientes não pareceu fazer o truque e você realmente precisa de uma biblioteca para fazer isso:As barras verticais são necessárias, caso contrário, o Windows trava no
export NODE_ENV
comando não reconhecido : D. Não sei quanto ao espaço de fuga, mas só para ter certeza de que também os removi.fonte
&&
?NODE_ENV=test yadda
meios "runyadda
, estabelecendoNODE_ENV
dentroyadda
. 's variáveis de ambienteNODE_ENV=test && yadda
significa 'conjuntoNODE_ENV
dentro do ambiente local, mas não exportá-lo, em seguida, executaryadda
'.NODE_ENV=test yadda
é a abordagem preferida.NODE_ENV=test && npm run test
algo parecido. Fiz uma solução melhor usandoprocess.env["NODE_ENV"] = "testing";
dentro do meu arquivo testhelper.js.&&
suas variáveis de ambiente perdidas, definir variáveis de ambiente sem exportação funciona apenas no comando atual (o que não é nada). para executar o comando com a variável env sem exportar u fazer:NODE_ENV=test npm run test
. Finalmente, o motivo pelo qual funcionou depois que você exportou é porque sua variável está disponível (exportada) na sessão e seu NODE_ENV sem exportação não estava fazendo nada.Tente isso no Windows, substituindo
YOURENV
:fonte
de repente, descobri que o actionhero está usando o seguinte código, que resolveu meu problema, apenas passando a
--NODE_ENV=production
opção de comando start script.Eu realmente gostaria de aceitar a resposta de outra pessoa que conhece uma maneira melhor de definir variáveis de ambiente no package.json ou no script init ou algo parecido, onde o aplicativo é inicializado por outra pessoa.
fonte
Para um conjunto maior de variáveis de ambiente ou quando você deseja reutilizá-las, pode usar
env-cmd
../.env
Arquivo:./package.json
:fonte
process.env.ENV1
mongod --dbpath ~/data/db
. Eu quero executar algo parecidonpm mongodb
e que irá obter a variável de ambiente dbpath e executar o mondodb como sempre ... e .. eu quero compartilhá-lo com outros membros.Embora não responda diretamente à pergunta, gostaria de compartilhar uma ideia sobre as outras respostas. Pelo que obtive, cada uma delas ofereceria algum nível de complexidade para obter independência entre plataformas.
No meu cenário, tudo que eu queria, originalmente, definir uma variável para controlar se protegia ou não o servidor com autenticação JWT (para fins de desenvolvimento)
Depois de ler as respostas, decidi simplesmente criar 2 arquivos diferentes, com a autenticação ativada e desativada, respectivamente.
Os arquivos são simplesmente invólucros que chamam o arquivo index.js original (ao qual renomei
appbootstrapper.js
):Talvez isso possa ajudar outra pessoa
fonte
fonte
Isso funcionará no console do Windows :
npm run aaa
resultado:
test
Veja esta resposta para detalhes.
fonte
set TMP=test&& npm run bbb
. O espaço antes&&
também cound como parte do entãoNODE_ENV
corda"
.use git bash no windows. O Git Bash processa comandos de maneira diferente do cmd.
A maioria dos prompts de comando do Windows é bloqueada quando você define variáveis de ambiente com NODE_ENV = produção como essa. (A exceção é o Bash no Windows, que usa o Bash nativo.) Da mesma forma, há uma diferença em como o Windows e os comandos POSIX utilizam variáveis de ambiente. Com o POSIX, você usa: $ ENV_VAR e, no Windows,% ENV_VAR%. - documento entre env
use o pacote dotenv para declarar as variáveis env
fonte
Você não deve definir variáveis ENV em
package.json
. O actionhero usaNODE_ENV
para permitir que você altere as opções de configuração carregadas dos arquivos./config
. Confira o arquivo de configuração redis e veja como o NODE_ENV é usado para alterar as opções do banco de dados emNODE_ENV=test
Se você quiser usar outras variáveis ENV para definir as coisas (talvez a porta HTTP), ainda não precisará alterar nada
package.json
. Por exemplo, se você definirPORT=1234
em ENV e quiser usá-la como a porta HTTPNODE_ENV=production
, apenas faça referência a isso no arquivo de configuração relevante, IE:fonte
npm start
comando Usando o trecho acima, se você queria correr o servidor usando a porta ENV seria:export PORT=1234; npm start
. Você pode anexar quantas declarações ENV forem necessárias, mas elas não pertencem ao arquivo package.json. Se você está preocupado com certificando-se de que eles existem, você deve usar padrões em seu arquivo de configuração:port: process.env.PORT || 8080
.NODE_ENV=test npm start
ou tê-los definido pelo shellO npm (e yarn) passa muitos dados do package.json para scripts como variáveis de ambiente. Use
npm run env
para ver todos eles. Isso está documentado em https://docs.npmjs.com/misc/scripts#environment e não é apenas para scripts de "ciclo de vida", comoprepublish
também qualquer script executado pornpm run
.Você pode acessar esses códigos internos (por exemplo,
process.env.npm_package_config_port
em JS), mas eles já estão disponíveis para o shell que está executando os scripts, para que você também possa acessá-los como$npm_...
expansões nos "scripts" (sintaxe unix, pode não funcionar no Windows?).A seção "config" parece destinada a esse uso:
Uma qualidade importante desses campos "config" é que os usuários podem substituí-los sem modificar o package.json !
Consulte os documentos de configuração do npm e de configuração do fio .
Parece que fio lê
~/.npmrc
tãonpm config set
afeta tanto, masyarn config set
escreve~/.yarnrc
, tão somente fio vai vê-lo :-(fonte
A resposta de @ luke foi quase a que eu precisava! Obrigado.
Como a resposta selecionada é muito direta (e correta), mas antiga, gostaria de oferecer uma alternativa para importar variáveis de um arquivo .env separado ao executar seus scripts e corrigir algumas limitações na resposta de Luke. Tente o seguinte:
::: arquivo .env :::
Então, no seu pacote json, você criará um script que definirá as variáveis e executará antes dos scripts necessários:
::: package.json :::
Algumas observações:
A expressão regular no comando grep'ed cat limpará os comentários e as linhas vazias.
O
&&
não precisa ser "colado" paranpm run set-env
, como seria necessário se você estava definindo as variáveis no mesmo comando.Se você estiver usando fio, poderá receber um aviso, pode alterá-lo
yarn set-env
ou usá-lonpm run set-env --scripts-prepend-node-path &&
.Ambientes diferentes
Outra vantagem ao usá-lo é que você pode ter diferentes variáveis de ambiente.
fonte