Отправка аргументов командной строки в 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?
Установка локального модуля с помощью npm?
Что делает npm install --legacy-peer-deps? Когда рекомендуется использовать и какой потенциальный случай?
npm install против update - в чем разница?