Отправка аргументов командной строки в npm-скрипт
У меня есть файл package.json
, и его раздел scripts
выглядит следующим образом:
"scripts": {
"start": "node ./script.js server"
}
Это позволяет мне запускать npm start
для старта сервера, что вполне нормально.
Тем не менее, я хотел бы иметь возможность запускать что-то вроде npm start 8080
и чтобы аргументы передавались в script.js
(например, npm start 8080
=> node ./script.js server 8080
). Возможно ли это сделать?
5 ответ(ов)
Вы также можете сделать так:
В package.json
:
"scripts": {
"cool": "./cool.js"
}
В cool.js
:
console.log({ myVar: process.env.npm_config_myVar });
В командной строке:
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>]
Представим, что у нас есть задача npm start в файле package.json для запуска webpack dev server:
"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, вы также можете установить параметры в конфигурации вашего 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, который будет равен либо prod, либо dev:
var env = process.env.NODE_ENV || 'prod';
if (env === 'dev') {
var app = require("./serverDev.js");
} else {
var app = require("./serverProd.js");
}
Чтобы использовать 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]
— это исполняемый файл (node), а process.argv[1]
— это ваш скрипт.
Тестировалось с npm v5.3.0 и node v8.4.0
Большинство ответов выше касаются только передачи аргументов в ваш скрипт NodeJS, вызываемый через npm. Моё решение подходит для общего использования.
Просто оберните npm-скрипт в вызов оболочки (например, sh
) и передавайте аргументы как обычно. Единственное исключение состоит в том, что первый номер аргумента — это 0
.
Например, вы хотите добавить npm-скрипт someprogram --env=<аргумент_1>
, где someprogram
просто выводит значение аргумента env
:
package.json
"scripts": {
"command": "sh -c 'someprogram --env=$0'"
}
Когда вы выполните его:
% npm run -s command my-environment
my-environment
Если вы хотите передать аргументы в середину скрипта 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
передаётся babel, в то время как npm run start
просто выполняет обычную сборку один раз.
Где npm устанавливает пакеты?
Как вывести список установленных пакетов npm?
Функция map для объектов (вместо массивов)
Как удалить модули npm в Node.js?
Как получить полный объект в console.log() Node.js, а не '[Object]'?