package.json에서 환경 변수를 설정하는 방법


313

내부에서 일부 환경 변수를 설정 package.json하여 npm start유사한 명령 과 함께 사용하는 방법 은 무엇입니까?

여기 내가 현재 가지고있는 것이 있습니다 package.json:

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "tagove start"
  }
  ...
}

NODE_ENV시작 스크립트에서 환경 변수 (예 :)를 설정하고 명령 하나만으로 앱을 시작할 수 npm start있습니다.


이 답변을 읽을 수 있습니다 stackoverflow.com/a/57509175/11127383
Daniel Danielecki

답변:


433

스크립트 명령에서 환경 변수를 설정하십시오.

...
"scripts": {
  "start": "node app.js",
  "test": "env NODE_ENV=test mocha --reporter spec"
},
...

그런 다음 process.env.NODE_ENV앱에서 사용 하십시오.

참고 : env여러 플랫폼에서 작동합니다. Mac / Linux에만 관심이 있다면 생략해도됩니다.


65
어떤 사람이 창문을 대체 할 방법을 찾았습니까?
무한

65
@infinity는 교차 환경 을 사용하며 사용하기가 매우 쉽습니다.
mikekidder 2016 년

106
@ 무한 사용 set NODE_ENV=test&& mocha --reporter spec- 의도적으로 테스트와 && 사이에 공백이 없습니다.
Jamie Penney

18
"test": "NODE_ENV=test mocha --reporter spec"Windows 시스템에서는 작동하지 않습니다.
Benny Neugebauer

7
@infinity @ jamie-penney env NODE_ENV=test mocha --reporter spec는 선언 된 환경 변수를 기본적으로 크로스 플랫폼 방식으로 사용하지만, 핵심은 npm 스크립트 실행을 위해 임시 및 일회성 방식으로 npm에서 사용한다는 것입니다. (나중에 참조 할 수 있도록 설정하거나 내 보내지 않았습니다.) npm 스크립트에서 명령을 실행하는 한 문제가 없습니다. 또한 이런 식으로 "&&"를 제거해야합니다.
estaples

219

NPM 패키지 cross-env 만 사용하십시오 . 매우 쉽습니다. Windows, Linux 및 모든 환경에서 작동합니다. &&를 사용하여 다음 작업으로 이동하지 마십시오. 환경을 설정 한 후 다음 작업을 시작하면됩니다. 여기 의견 중 하나에 대한 제안에 대해 @mikekidder 에게 감사드립니다 .

설명서에서 :

{
  "scripts": {
    "build": "cross-env NODE_ENV=production OTHERFLAG=myValue webpack --config build/webpack.config.js"
  }
}

여러 전역 변수를 설정하려면 연속적으로 변수를 지정하고 명령을 실행하십시오.

궁극적으로 (스폰을 사용하여) 실행되는 명령은 다음과 같습니다.

webpack --config build/webpack.config.js

NODE_ENV환경 변수 간 ENV 설정 될


트리플 백 슬래시는 필수 인용문을 피하기 위해 사용할 수 있습니다."test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"
bvj

1
크로스 플랫폼 때문에 최상의 솔루션.
bernardn

누군가가 마지막으로 제가 사용할지 결정하는 데 도움이 수 env또는 cross-env? 한편으로 env는 아무것도 설치하지 않아도되고 다른 한편으로 cross-env는 더 인기가 있습니다. 누군가 env가 모든 플랫폼에서 작동 하는지 확인할 수 있습니까 ?
Rishav

2
@Rishav env는 모든 플랫폼에서 그대로 작동하지 않으므로 cross-env존재 하는 이유 가 있습니다. 그냥 사용 cross-env하고 끝내십시오.
TetraDev

37

미래의 노드 탐색기를 위해 여기에 2 센트를 추가하고 싶었습니다. 내 우분투 14.04에서 NODE_ENV=test작동하지 않았는데, export NODE_ENV=test후에도 NODE_ENV=test일하기 시작한 이상한 것을 사용해야 했습니다.

Windows에서 말했듯이 set NODE_ENV=test크로스 플랫폼 솔루션의 경우 크로스 환경 라이브러리가 트릭을 수행하지 않는 것처럼 보이므로 실제로이 작업을 수행하려면 라이브러리가 필요합니까?

export NODE_ENV=test || set NODE_ENV=test&& yadda yadda

그렇지 않으면 Windows가 인식 할 수없는 export NODE_ENV명령 인 : D 에서 충돌하므로 세로 막대가 필요합니다 . 후행 공간에 대해서는 몰라 그러나 나는 그것들도 제거했는지 확신합니다.


6
사용 했습니까 &&? NODE_ENV=test yadda수단 "실행 yadda, 설정 NODE_ENVyadda. 환경 변수의 NODE_ENV=test && yadda의미를"세트를 NODE_ENV로컬 환경에서, 그러나 것은, 다음 실행 보내지 않습니다 yadda. " NODE_ENV=test yadda선호하는 방법입니다.
조쉬 켈리

한동안 내 stackoverflow 계정을 확인하지 않아서 죄송합니다. 그러나 기본적으로 바보 같은 Windows는 NODE_ENV=test && npm run test비슷한 것을 사용하지 못했습니다 . process.env["NODE_ENV"] = "testing";testhelper.js 파일 내부를 사용하여 더 나은 솔루션을 만들었습니다 .
TeemuK

5
@TeemuK는 내 2 센트도 추가 &&하기 위해 환경 변수를 잃어 버린 상태에서 명령을 실행할 때 내보내기없이 환경 변수를 설정하면 현재 명령에서만 작동합니다 (아무것도 아닙니다). u를 내 보내지 않고 env 변수로 명령을 실행하려면 다음을 수행하십시오 NODE_ENV=test npm run test. 마지막으로 내 보낸 후 작동 한 이유는 세션에서 ur 변수를 사용할 수 있기 때문에 (내보내기) 내 보내지 않은 NODE_ENV가 아무 것도하지 않았기 때문입니다.
Tarek

37

여러 환경 변수로 작업하는 경우가 많으므로 별도의 .env파일 로 유지하는 것이 좋습니다 (소스 제어에서이 변수 를 무시하십시오).

VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break

그런 다음 export $(cat .env | xargs) &&스크립트 명령 앞에 추가 하십시오.

예:

{
  ...
  "scripts": {
    ...
    "start": "export $(cat .env | xargs) && echo do your thing here",
    "env": "export $(cat .env | xargs) && env",
    "env-windows": "export $(cat .env | xargs) && set"
  }
  ...
}

테스트를 위해 npm run env(linux) 또는 npm run env-windows(windows) 를 실행하여 env 변수를 볼 수 있습니다 .


아주 좋아, 거의 나를 위해 일을했다! 몇 가지 주석을 추가하고 싶습니다.-.env 파일에 빈 줄을 넣을 수 없습니다-.env 파일의 주석이 스크립트를 손상시킵니다-여러 스크립트가 동일한 .env 파일을 사용하는 경우 반복해야합니다. &&작동 하기 전에 공간을 제거해야 했습니다. .env 파일이 여러 개인 경우 대답을 유지하기가 조금 더 어려울 수 있습니다. stackoverflow.com/questions/25112510/…
Felipe N Moura

19

다음을 교체하여 Windows에서 시도하십시오 YOURENV.

  {
    ...
     "scripts": {
       "help": "set NODE_ENV=YOURENV && tagove help",
       "start": "set NODE_ENV=YOURENV && tagove start"
     }
    ...
  }

1
예! 감사합니다! 이것은 내가 찾고있는 대답이었습니다! : D
Daniel Tonon

6
&& 전에 공백을 제거해야했습니다.
Kenneth Solberg

@KennethSolberg의 의견은 그것이 나를 위해 일하게 된 마지막 손길이었습니다 (Windows 전용)
ulu

나도 우주 문제가 있었다. 문자열 길이를 기록 할 때 공간이 추가되었음을 알 수 있습니다. 나는 이스케이프 된 따옴표를 시도했지만 실제로 envar에 저장되었습니다. 다른 구분 기호를 사용해 보았습니다. 나에게 잘못 느껴지는 공간을 제거하거나 가치를 다듬는 것이이 문제를 해결하는 유일한 방법이었습니다.
Neil Guy Lindberg

8

갑자기 actionhero가 다음 코드를 사용하고 있음을 발견했습니다 --NODE_ENV=production. 시작 스크립트 명령 옵션을 전달 하여 문제를 해결했습니다 .

if(argv['NODE_ENV'] != null){
  api.env = argv['NODE_ENV'];
} else if(process.env.NODE_ENV != null){
  api.env = process.env.NODE_ENV;
}

package.json 또는 init 스크립트에서 환경 변수를 설정하는 더 나은 방법을 알고 있거나 다른 사람이 앱을 부팅하는 다른 사람의 답변을 받아 주셔서 감사합니다.


4

더 큰 환경 변수 세트를 사용하거나 재사용하려는 경우을 사용할 수 있습니다 env-cmd.

./.env 파일:

# This is a comment
ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH

./package.json:

{
  "scripts": {
    "test": "env-cmd mocha -R spec"
  }
}

스크립트에서 ENV1을 어떻게 사용합니까?
ValRob

평소process.env.ENV1
KARASZI István

그러나 package.json 내부? 나는 그것이 불가능하다는 것을 읽었 는가? (?)
ValRob

이해가 안 돼요 왜 그렇게 하시겠습니까?
KARASZI István

어리석은 접근 일지 모르지만 macOs Catalina를 업데이트했으며 mongodb 명령이 작동하지 않으므로 data / folder를 지정해야합니다 mongod --dbpath ~/data/db. 나는 비슷한 것을 실행 npm mongodb하고 환경 변수 dbpath를 얻고 mondodb를 항상 그렇듯이 실행합니다 ..... 다른 멤버와 공유하고 싶습니다.
ValRob

2

질문에 직접 대답하지는 않지만 다른 답변 위에 아이디어를 공유하고 싶습니다. 내가 얻은 것에서 크로스 플랫폼 독립성을 달성하기 위해 어느 정도의 복잡성을 제공 할 것입니다.

시나리오에서 원래 JWT 인증으로 서버를 보호할지 여부를 제어하는 ​​변수를 설정하기를 원했습니다 (개발 목적으로)

답을 읽은 후 인증을 켜고 끄는 두 개의 다른 파일을 만들기로 결정했습니다.

  "scripts": {
    "dev": "nodemon --debug  index_auth.js",
    "devna": "nodemon --debug  index_no_auth.js",
  }

파일은 단순히 원래 index.js 파일을 호출하는 래퍼입니다 (이름을으로 변경 appbootstrapper.js).

//index_no_auth.js authentication turned off
const bootstrapper = require('./appbootstrapper');
bootstrapper(false);

//index_auth.js authentication turned on
const bootstrapper = require('./appbootstrapper');
bootstrapper(true);

class AppBootStrapper {

    init(useauth) {
        //real initialization
    }
}

아마도 이것은 다른 사람을 도울 수 있습니다


2
{
  ...
  "scripts": {
    "start": "ENV NODE_ENV=production someapp --options"
  }
  ...
}

2

이것은 Windows 콘솔 에서 작동합니다 .

"scripts": {
  "aaa": "set TMP=test && npm run bbb",
  "bbb": "echo %TMP%"
}

npm run aaa

산출: test

자세한 내용은 이 답변 을 참조하십시오.


5
이어야 set TMP=test&& npm run bbb합니다. 그 전의 공간 &&도 다음 NODE_ENV줄의 일부로
뭉쳐 질 것입니다

@FisNaN 따옴표로 묶는 경우가 아니어야합니다 ".
카이저

1

에 ENV 변수를 설정해서는 안됩니다 package.json. actionhero를 사용 NODE_ENV하여의 파일에서로드 된 구성 옵션을 변경할 수 있습니다 ./config. redis 구성 파일을 확인하고 NODE_ENV가 데이터베이스 옵션을 변경하는 데 어떻게 사용되는지 확인하십시오.NODE_ENV=test

다른 ENV 변수를 사용하여 항목 (아마도 HTTP 포트)을 설정하려는 경우 여전히에서 아무것도 변경할 필요가 없습니다 package.json. 예를 들어, PORT=1234ENV로 설정하고 에서이를 HTTP 포트로 사용 NODE_ENV=production하려면 관련 구성 파일 IE에서 해당 포트를 참조하십시오.

# in config/servers/web.js
exports.production = { 
  servers: {
    web: function(api){
      return {
       port: process.env.PORT
      }
    }
  }
}

큰. 내 질문을 읽지 못했다고 생각합니다. 내 문제는 NODE_ENV를 사용하지 않는 방법입니다.
dev.meghraj

1
여러 환경 속성을 설정하려면 npm start명령 에서 수행하지 마십시오 . 위의 스 니펫을 사용하여 ENV 포트를 사용하여 서버를 실행하려면 다음과 같습니다 export PORT=1234; npm start. 필요한만큼 ENV 선언을 추가 할 수 있지만 package.json 파일에는 속하지 않습니다. 존재하는지 확인하는 것이 걱정된다면 구성 파일에서 기본값을 사용해야합니다 port: process.env.PORT || 8080.
Tony

1
아마도 이것을 설명하는 다른 방법은 NODE_ENV (및 기타 환경 변수)가 환경의 일부 (따라서 이름)라는 것입니다. 일반적으로 응용 프로그램이 아닌 응용 프로그램을 실행하는 서버의 속성입니다. 예를 들어 다음 NODE_ENV=test npm start과 같은 명령을 통해 수동으로 설정할 수 있습니다 : 또는 쉘에서 설정하도록
Evan

3
동의하지 않습니다. 모든 환경에 ./config를 사용하면 앱을 배포 할 때 정적 환경을 사용할 수 있습니다. 이것은 구식 철학으로, 필요할 때 새로운 유형의 환경을 가동시킬 수 없습니다. 원하는 모든 새 환경에 대해 IE를 사용하려면 .config를 추가해야합니다. 기술 스택에 더 많은 유연성이 필요한 경우 런타임에 환경 변수를 설정하는 것이 탁월한 옵션이 될 수 있습니다. ./config가 환경의 "유형"을 설정하는 데 좋을 것이라고 생각하지만 런타임에 dsn 문자열 및 api 끝점과 같은 것을 정의 할 수 있다면 앱이 더 유연합니다.
Jesse Greathouse 2014

@JesseGreathouse-node.js 응용 프로그램이 있고 런타임에 환경 변수를 설정해야합니다. 어떤 파일을 설정해야합니까?
Roger Dodger

1

npm (및 yarn)은 package.json 의 많은 데이터를 환경 변수로 스크립트에 전달 합니다. npm run env그들 모두를 보는 데 사용 하십시오. 이 내용은 https://docs.npmjs.com/misc/scripts#environment에 설명되어 있으며 "lifecycle"스크립트 prepublish뿐만 아니라에 의해 실행되는 스크립트에도 사용됩니다 npm run.

내부 코드 (예 : process.env.npm_package_config_portJS)에 액세스 할 수 있지만 스크립트를 실행하는 셸에서 이미 사용할 수 있으므로 $npm_..."스크립트"의 확장으로 액세스 할 수 있습니다 (유닉스 구문, Windows에서는 작동하지 않을 수 있습니까?).

"설정"섹션 이 사용하기위한 것 같다 :

  "name": "myproject",
  ...
  "config": {
    "port": "8010"
  },
  "scripts": {
    "start": "node server.js $npm_package_config_port",
    "test": "wait-on http://localhost:$npm_package_config_port/ && node test.js http://localhost:$npm_package_config_port/"
  } 

이러한 "config"필드의 중요한 품질은 사용자가 package.json을 수정하지 않고이를 무시할 수 있다는 것입니다 !

$ npm run start

> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port

Serving on localhost:8010

$ npm config set myproject:port 8020
$ git diff package.json  # no change!
$ cat ~/.npmrc
myproject:port=8020

$ npm run start

> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port

Serving on localhost:8020

npm 구성yarn 구성 문서를 참조하십시오 .
원 사는 읽기 ~/.npmrcnpm config set두 가지 모두에 영향을 주지만 yarn config set쓰기는 ~/.yarnrc하므로 원사 만 볼 수 있습니다.


1

@luke의 답변은 내가 필요한 거의 하나였습니다! 감사.

선택한 답변은 매우 간단하고 정확하지만 오래되었으므로 스크립트를 실행할 때 .env 별도 파일에서 변수를 가져오고 Luke의 답변에 몇 가지 제한 사항을 수정하는 대안을 제공하고 싶습니다. 이 시도:

::: .env 파일 :::

# This way, you CAN use comments in your .env files
NODE_PATH="src/"

# You can also have extra/empty lines in it
SASS_PATH="node_modules:src/styles"

그런 다음 패키지 json에서 변수를 설정하고 필요한 스크립트보다 먼저 실행하는 스크립트를 작성합니다.

::: package.json :::

scripts: {
  "set-env": "export $(cat .env | grep \"^[^#;]\" |xargs)",
  "storybook": "npm run set-env && start-storybook -s public"
}

일부 관찰 :

  • grep'ed cat 명령의 정규식은 주석과 빈 줄을 지 웁니다.

  • &&될 필요는 없다 "붙어"npm run set-env같은 명령에 변수를 설정 한 경우가 필요한 것처럼.

  • 원사를 사용하는 경우 경고가 표시 될 수 있습니다. 원사를 변경 yarn set-env하거나 npm run set-env --scripts-prepend-node-path &&대신 사용할 수 있습니다 .

다른 환경

그것을 사용할 때의 또 다른 이점은 다른 환경 변수를 가질 수 있다는 것입니다.

scripts: {
  "set-env:production": "export $(cat .production.env | grep \"^[^#;]\" |xargs)",
  "set-env:development": "export $(cat .env | grep \"^[^#;]\" |xargs)",
}

키, 비밀번호 또는 현명한 / 개인 데이터가있는 경우 .env 파일을 git 저장소에 추가하지 마십시오!


1

Windows에서 git bash를 사용하십시오. Git Bash는 cmd와 다르게 명령을 처리합니다.

NODE_ENV = production과 같은 환경 변수를 설정하면 대부분의 Windows 명령 프롬프트가 질식합니다. (기본 Bash를 사용하는 Windows의 Bash는 예외입니다.) 마찬가지로 Windows 및 POSIX 명령이 환경 변수를 사용하는 방법에는 차이가 있습니다. POSIX에서는 $ ENV_VAR을 사용하고 Windows에서는 % ENV_VAR %를 사용합니다. -교차 환경 문서

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "env NODE_ENV=production tagove start"
  }
  ...
}

dotenv 패키지를 사용하여 env 변수 선언

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.