Отправка аргументов командной строки в сценарий 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). Это возможно?
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 поддержка аргументы командной строки
команда
.json
npm run-script start -- --foo=3.js
"start": "node ./index.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=userFYI
yarn -v 1.6.0 npm -v 5.6.0
Comments