Отправка аргументов командной строки в сценарий npm

The scripts часть package.json в настоящее время выглядит так:

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

...а это значит, что я могу бежать!--3--> для запуска сервера. Пока все хорошо.

однако я хотел бы иметь возможность запускать что-то вроде npm start 8080 и передайте аргумент(ы) в script.js (например,npm start 8080 =>node ./script.js server 8080). Возможно ли это?

10 ответов


изменить 2014.10.30: можно передать args в npm run начиная с НПМ 2.0.0

синтаксис выглядит следующим образом:

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 exposes process.argv глобально, содержащий значения параметров командной строки, но это низкоуровневый API (массив строк, разделенный пробелами, как это предусмотрено операционной системой исполняемому узлу).


изменить 2013.10.03: в настоящее время невозможно напрямую. Но есть родственное GitHub вопрос открыт на npm реализовать поведение, которое вы просите. Кажется, консенсус должен быть реализован, но это зависит от другого вопроса, который решается раньше.


оригинальный ответ: в какой-то обходной путь (хотя и не очень удобно), вы можете сделать как следует:

Скажи свое имя пакета из package.json is 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 start будет использовать 8080. Однако вы можете настроить его (значение будет сохранено 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' }

Update: используя npm 3.10.3, кажется, что он строчные буквы process.env.npm_config_ переменные? Я также использую better-npm-run, поэтому я не уверен, что это поведение по умолчанию ванили или нет, но этот ответ is работает. Вместо process.env.npm_config_myVar попробуй process.env.npm_config_myvar


Якуб.gответ правильный, однако пример использования grunt кажется немного сложным.

Итак, мой более простой ответ:

- отправка аргумента командной строки в сценарий npm

синтаксис для отправки аргументов командной строки в сценарий npm:

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

представьте, что у нас есть задача запуска npm в нашем пакете.json для запуска сервера webpack dev:

"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

- используя пакет.конфигурация json:

как отметил Якуб.g, вы можете альтернативно установить параметры в конфигурации вашего пакета.в JSON

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

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

npm start будет использовать порт указанный в config, или вы можете переопределить его

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 в сервер.js или prod или 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

.в JSON

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

.js

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


использовать process.argv в вашем коде просто укажите трейлинг $* для записи значения скриптов.

echoargs.js:

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

пакета.в 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 передает -w смотреть флаг Вавилона, но npm run start просто запускает обычную сборку один раз.


это на самом деле не отвечает на ваш вопрос, но вы всегда можете использовать переменные среды:

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

затем на вашем сервере.файл js:

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

от того, что я вижу, люди используют пакет.JSON скрипты, когда они хотели бы запустить скрипт более простым способом. Например, использовать nodemon это установлено в локальных node_modules, мы не можем вызвать nodemon непосредственно из cli, но мы можем вызвать его с помощью ./node_modules/nodemon/nodemon.js. Итак, чтобы упростить этот длинный набор, мы можем поставить это...


    ...

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

    ...

... тогда звоните npm start использовать 'nodemon', который имеет приложение.JS в качестве первого аргумента.

что я пытаюсь сказать, если вы просто хотите, чтобы начать свой сервер с node command, я не думаю, что вам нужно использовать scripts. Набрав npm start или node app.js имеет такое же усилие.

но если вы хотите использовать nodemon, и хотите передать динамический аргумент, не используйте script либо. Попробуйте использовать символическую ссылку.

например, используя миграцию с sequelize. Я создаю символическую ссылку...

ln -s node_modules/sequelize/bin/sequelize sequelize

... И я могу пройти любой спор, когда я его назову. ...

./sequlize -h /* show help */

./sequelize -m /* upgrade migration */

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

etc...

на данный момент использование symlink-лучший способ понять, но я не думаю, что это лучшая практика.

я также надеюсь на ваше мнение к моему ответу.


Я нашел этот вопрос, когда я пытался решить свою проблему с запуском Seed Seed: generate CLI command:

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

позвольте мне перейти к делу. Я хотел иметь короткую команду сценария в моем пакета.в JSON file и предоставить --name аргумент в то же время

ответ пришел после некоторых экспериментов. Вот моя команда в пакета.в JSON

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

... а вот и пример запуска в терминал к создать исходный файл для пользователей

> yarn seed:generate --name=user

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

к твоему сведению!--5-->

yarn -v
1.6.0

npm -v
5.6.0