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



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



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


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



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

728   10  

10 ответов:

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


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


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

Скажи свое имя пакета от package.json и 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 должен быть решен.

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

In package.json:

"scripts": {
    "cool": "./cool.js"
}

In 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, поэтому я не уверен, что это ванильное поведение по умолчанию или нет, но этот ответ и работает. Вместо process.env.npm_config_myVar попробуй process.env.npm_config_myvar

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

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

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

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

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

представьте, что у нас есть задача запуска npm в нашем пакете.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

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

как отметил Якуб.g, вы можете также установить параметры в конфиг свой пакета.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 в сервер.js или прод или 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 поддержка аргументы командной строки

команда

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 file:

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 команда, я не думаю, что вам нужно использовать 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 файл и предоставить -- 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

FYI

yarn -v
1.6.0

npm -v
5.6.0

Comments

    Ничего не найдено.