14

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

13

У меня есть файл 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 ответ(ов)

1

Вы также можете сделать так:

В 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.

1

Ответ пользователя 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");
}
0

Чтобы использовать 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

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь