Редактировать 2014.10.30: Можно передать args в npm run
с npm 2.0.0
Синтаксис выглядит следующим образом:
npm run
Обратите внимание на --
. Необходимо отделить параметры, переданные команде 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
становится переопределенным).