Programing

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

lottogame 2020. 10. 2. 21:20
반응형

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


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

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

... 즉 npm start, 서버를 시작하기 위해 실행할 수 있습니다 . 여태까지는 그런대로 잘됐다.

그러나 나는 같은 것을 실행하고 (예 : => ) npm start 8080인수를 전달할 수 있기를 원합니다 . 이것이 가능한가?script.jsnpm start 8080node ./script.js server 8080


2014.10.30 편집 : npm 2.0.0 부터 인수를 전달할 수 있습니다.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 start9090이 사용됩니다 (기본값 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 구성 사용 :

As mentioned by jakub.g, you can alternatively set params in the config of your package.json

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

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

npm start will use the port specified in your config, or alternatively you can override it

npm config set myPackage:myPort 3000

- Setting a param in your npm script

An example of reading a variable set in your npm script. In this example NODE_ENV

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

read NODE_ENV in server.js either prod or 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 support cli args

Command

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

Package.json

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

Index.js

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


Use process.argv in your code then just provide a trailing $* to your scripts value entry.

As an example try it with a simple script which just logs the provided arguments to standard out echoargs.js:

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

package.json:

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

Examples:

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

process.argv[0] is the executable (node), process.argv[1] is your script.

Tested with npm v5.3.0 and node v8.4.0


If you want to pass arguments to the middle of an npm script, as opposed to just having them appended to the end, then inline environment variables seem to work nicely:

"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",
},

Here, npm run dev passes the -w watch flag to babel, but npm run start just runs a regular build once.


This doesn't really answer your question but you could always use environment variables instead:

"scripts": {
    "start": "PORT=3000 node server.js"
}

Then in your server.js file:

var port = process.env.PORT || 3000;

From what I see, people use package.json scripts when they would like to run script in simpler way. For example, to use nodemon that installed in local node_modules, we can't call nodemon directly from the cli, but we can call it by using ./node_modules/nodemon/nodemon.js. So, to simplify this long typing, we can put this...


    ...

    scripts: {
      'start': 'nodemon app.js'
    }

    ...

... then call npm start to use 'nodemon' which has app.js as the first argument.

What I'm trying to say, if you just want to start your server with the node command, I don't think you need to use scripts. Typing npm start or node app.js has the same effort.

But if you do want to use nodemon, and want to pass a dynamic argument, don't use script either. Try to use symlink instead.

For example using migration with sequelize. I create a symlink...

ln -s node_modules/sequelize/bin/sequelize sequelize

... And I can pass any arguement when I call it ...

./sequlize -h /* show help */

./sequelize -m /* upgrade migration */

./sequelize -m -u /* downgrade migration */

etc...

At this point, using symlink is the best way I could figure out, but I don't really think it's the best practice.

I also hope for your opinion to my answer.


I've found this question while I was trying to solve my issue with running sequelize seed:generate cli command:

node_modules/.bin/sequelize seed:generate --name=user

Let me get to the point. I wanted to have a short script command in my package.json file and to provide --name argument at the same time

The answer came after some experiments. Here is my command in package.json

"scripts: {
  "seed:generate":"NODE_ENV=development node_modules/.bin/sequelize seed:generate"
}

... and here is and example of running it in terminal to generate a seed file for a user

> yarn seed:generate --name=user

> npm run seed:generate -- --name=user

FYI

yarn -v
1.6.0

npm -v
5.6.0

npm run script_target -- < argument > Basically this is the way of passing the command line arguments but it will work only in case of when script have only one command running like I am running a command i.e. npm run start -- 4200

"script":{
       "start" : "ng serve --port="
 }

This will run for passing command line parameters but what if we run more then one command together like npm run build c:/workspace/file

"script":{
       "build" : "copy c:/file <arg> && ng build"
 } 

but it will interpreter like this while running copy c:/file && ng build c:/work space/file and we are expected something like this copy c:/file c:/work space/file && ng build

Note :- so command line parameter only work ad expected in case of only one command in a script.

I read some answers above in which some of them are writing that you can access the command line parameter using $ symbol but this will not gonna work


I have used the following way to run a test

  "scripts": {  
       "test-one": "mocha --timeout 90000 --watch --require ts-node/register --watch-extensions ts $1"
}

To run the test used following command

npm run test-one ./e2e/<test_file_path>

I do not have to use any config for it. I feel you can pass an argument the same way I am doing here.

참고URL : https://stackoverflow.com/questions/11580961/sending-command-line-arguments-to-npm-script

반응형