[javascript] npm 스크립트로 명령 행 인수 보내기

scripts내 부분 package.json현재는 다음과 같습니다 :

"scripts": {
    "start": "node ./script.js server"
}

npm start서버를 시작하기 위해 실행할 수 있음을 의미 합니다. 여태까지는 그런대로 잘됐다.

그러나 나는 비슷한 것을 실행 npm start 8080하고 인수 script.js(예 npm start 8080:> node ./script.js server 8080)를 전달 하고 싶습니다 . 이것이 가능한가?



답변

2014.10.30 편집 : npm 2.0.0 부터 args를 전달할 수 있습니다npm run

구문은 다음과 같습니다.

npm run <command> [-- <args>]

필요한 것을 유의하십시오 --. npm명령 자체에 전달 된 매개 변수와 스크립트에 전달 된 매개 변수를 분리 해야합니다.

당신이 있다면 package.json

"scripts": {
    "grunt": "grunt",
    "server": "node server.js"
}

다음 명령은 동일합니다.

grunt task:target => npm run grunt -- task:target

node server.js --port=1337 => npm run server -- --port=1337

매개 변수 값을 얻으려면 이 질문을 참조하십시오 . 명명 된 매개 변수를 읽으 려면 yargs 또는 minimist 와 같은 구문 분석 라이브러리를 사용하는 것이 가장 좋습니다 . nodejs는 process.argv명령 행 매개 변수 값을 포함하여 전체적으로 노출 되지만 이는 저수준 API (운영 체제에서 노드 실행 파일에 제공하는 공백으로 구분 된 문자열 배열)입니다.


편집 2013.10.03 : 현재 직접 불가능합니다. 그러나 원하는 동작을 구현하기 위해 관련된 GitHub 문제가 열렸습니다npm . 컨센서스가 이것을 구현하는 것으로 보이지만 이전에 해결 된 다른 문제에 달려 있습니다.


원래 답변 : 일종의 해결 방법으로 (매우 편리하지는 않지만) 다음과 같이 할 수 있습니다.

에서 패키지 이름을 말 package.jsonIS myPackage당신은 또한이

"scripts": {
    "start": "node ./script.js server"
}

그런 다음 추가하십시오 package.json:

"config": {
    "myPort": "8080"
}

그리고 당신의 script.js:

// defaulting to 8080 in case if script invoked not via "npm run-script" but directly
var port = process.env.npm_package_config_myPort || 8080

이렇게하면 기본적으로 npm start8080이 사용됩니다. 그러나 구성 할 수 있습니다 (값은 npm내부 저장소에 저장 됨).

npm config set myPackage:myPort 9090

그런 다음을 호출 npm start하면 9090이 사용됩니다 (기본값 package.json은 재정의 됨).


답변

와 같은 것을 실행할 수 있도록 요청했습니다 npm start 8080. script.js다음과 같이 파일 을 수정 하거나 구성 할 필요가 없습니다 .

예를 들어, "scripts"JSON 값에 다음을 포함하십시오.

"start": "node ./script.js server $PORT"

그런 다음 명령 줄에서

$ PORT=8080 npm start

나는 이것이 bash와 npm 1.4.23을 사용하여 작동한다는 것을 확인했다. 이 해결 방법으로 GitHub npm 문제 # 3494 를 해결할 필요는 없습니다 .


답변

당신은 또한 그것을 할 수 있습니다 :

에서 package.json:

"scripts": {
    "cool": "./cool.js"
}

에서 cool.js:

 console.log({ myVar: process.env.npm_config_myVar });

CLI에서 :

npm --myVar=something run-script cool

출력해야합니다 :

{ myVar: 'something' }

업데이트 : npm 3.10.3을 사용하면 process.env.npm_config_변수가 소문자로 표시 됩니까? 나는 또한 사용 better-npm-run하고 있기 때문에 이것이 바닐라 기본 동작인지 확실하지 않지만이 대답 은 효과가 있습니다. 대신 process.env.npm_config_myVar, 시도process.env.npm_config_myvar


답변

jakub.g 의 답변은 정확하지만 grunt를 사용하는 예제는 약간 복잡해 보입니다.

그래서 내 간단한 대답 :

-npm 스크립트에 명령 행 인수 보내기

명령 행 인수를 npm 스크립트로 보내는 구문 :

npm run [command] [-- <args>]

webpack dev 서버를 시작하기 위해 package.json에 npm 시작 작업이 있다고 상상해보십시오.

"scripts": {
  "start": "webpack-dev-server --port 5000"
},

우리는 이것을 커맨드 라인에서 실행합니다. npm start

이제 npm 스크립트에 포트를 전달하려면 다음을 수행하십시오.

"scripts": {
  "start": "webpack-dev-server --port process.env.port || 8080"
},

이것을 실행하고 포트를 5000 번 명령 줄을 통해 전달하면 다음과 같습니다

npm start --port:5000

-package.json 구성 사용 :

에서 언급 한 바와 같이 jakub.g , 당신은 다른 방법으로 당신의 설정에 PARAMS을 설정할 수 있습니다 package.json

"config": {
  "myPort": "5000"
}

"scripts": {
  "start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080"
},

npm start 구성에 지정된 포트를 사용하거나 대체 할 수 있습니다

npm config set myPackage:myPort 3000

-npm 스크립트에서 매개 변수 설정

npm 스크립트에서 변수 세트를 읽는 예입니다. 이 예에서NODE_ENV

"scripts": {
  "start:prod": "NODE_ENV=prod node server.js",
  "start:dev": "NODE_ENV=dev node server.js"
},

에 NODE_ENV을 읽을 server.js 중 하나를 찌르다 또는 DEV

var env = process.env.NODE_ENV || 'prod'

if(env === 'dev'){
    var app = require("./serverDev.js");
} else {
    var app = require("./serverProd.js");
}


답변

npm 2.x 지원 cli args

명령

npm run-script start -- --foo=3

Package.json

"start": "node ./index.js"

Index.js

console.log('process.argv', process.argv);


답변

process.argv코드에서 사용 하고 $*스크립트 값 입력에 후행 을 제공 하십시오.

예를 들어 제공된 인수를 표준 출력에 기록하는 간단한 스크립트로 시도하십시오 echoargs.js.

console.log('arguments: ' + process.argv.slice(2));

package.json :

"scripts": {
    "start": "node echoargs.js $*"
}

예 :

> npm start 1 2 3
arguments: 1,2,3

process.argv[0]실행 파일 (노드)이며 process.argv[1]스크립트입니다.

npm v5.3.0 및 노드 v8.4.0으로 테스트


답변

인수를 끝에 추가하는 대신 npm 스크립트의 중간에 인수를 전달하려면 인라인 환경 변수가 잘 작동하는 것 같습니다.

"scripts": {
  "dev": "BABEL_ARGS=-w npm run build && cd lib/server && nodemon index.js",
  "start": "npm run build && node lib/server/index.js",
  "build": "mkdir -p lib && babel $BABEL_ARGS -s inline --stage 0 src -d lib",
},

여기 npm run dev에서 -wwatch 플래그를 babel에 전달 하지만 npm run start일반 빌드를 한 번만 실행하십시오.