Изменить 2014.10.30: есть возможность передавать аргументы с 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
is, 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
переопределяется значение по умолчанию ).
yargs
; все параметры после--
могут быть проанализированы в вашем скрипте.-- --args
святое дерьмо , что это странно , но хорошоВы просили, чтобы иметь возможность запустить что-то вроде
npm start 8080
. Это возможно без необходимости измененияscript.js
или конфигурации файлов следующим образом.Например, в вашем
"scripts"
значении JSON, включите:А затем из командной строки:
Я подтвердил, что это работает, используя bash и npm 1.4.23. Обратите внимание, что этот обходной путь не требует решения проблемы GitHub npm # 3494 .
источник
node ./script.js server ${PORT:-8080}
чтобы сделать это необязательным.NODE_PORT=${PORT=8080}
(примерно так же), но не: - синтаксисnode ./script.js server %PORT%
. Рассмотрите возможность использования cross-var и cross-env .Вы также можете сделать это:
В
package.json
:В
cool.js
:В CLI:
Должен вывести:
Обновление: Используя npm 3.10.3, кажется, что это строчные буквы
process.env.npm_config_
переменных? Я также используюbetter-npm-run
, так что я не уверен , если это ваниль поведение по умолчанию или нет, но этот ответ будет работать. Вместоprocess.env.npm_config_myVar
, чтобы попробоватьprocess.env.npm_config_myvar
источник
process.env.npm_config_myVar
возвращает истину, а не значение.jakub.g ответ правильный, однако пример с использованием grunt кажется немного сложным.
Итак, мой более простой ответ:
- Отправка аргумента командной строки в скрипт npm
Синтаксис для отправки аргументов командной строки в скрипт npm:
Представьте, что в нашем package.json есть задача запуска npm, чтобы запустить сервер разработки webpack:
Мы запускаем это из командной строки с
npm start
Теперь, если мы хотим передать порт в скрипт npm:
запуск этого и передача порта, например 5000 через командную строку, будет выглядеть следующим образом:
- Использование config.json config:
Как упомянуто jakub.g , вы можете установить параметры в конфигурации вашего package.json.
npm start
будет использовать порт, указанный в вашей конфигурации, или вы можете переопределить его- Установка параметров в вашем скрипте npm
Пример чтения набора переменных в вашем скрипте npm. В этом примере
NODE_ENV
читать NODE_ENV в server.js либо prod, либо dev
источник
"start:prod": "NODE_ENV=prod node server.js"
inpackage.json
, не будет работать в Windows, если вы не используете cross-env"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080" },
должно быть в"start": "webpack-dev-server --port $npm_package_config_myPort || 8080" },
соответствии с моим использованием, объясненным в этом руководстве . Ссылка на процесс может быть использована в JavaScript, по-видимому.Npm 2.x Поддержка Cli Args
команда
npm run-script start -- --foo=3
Package.json
"start": "node ./index.js"
index.js
console.log('process.argv', process.argv);
источник
Используйте
process.argv
в своем коде, а затем просто предоставить трейлинг$*
в конец значения для ваших скриптов.В качестве примера попробуйте это с помощью простого скрипта, который просто записывает предоставленные аргументы в стандартный формат
echoargs.js
:package.json:
Примеры:
process.argv[0]
это исполняемый файл (узел),process.argv[1]
это ваш скрипт.Протестировано с npm v5.3.0 и узлом v8.4.0
источник
--
к аргументам, например -npm run demo.js --skip
, работает, если добавлен дополнительный--
, например -npm run demo.js -- --skip
echoargs.js
файла сценария?adb
для толкания.db
файла в эмулятор Android и принимает параметр для локального пути.db
файла, чтобы передать к нему, который является первым параметромadb push
. Как-то так:"db:push": "adb push process.argv.slice(2) /data/data/com.cntral.app/databases/database.db"
и я хочу позвонитьnpm run db:push /Users/joshuapinter/Downloads/updated.db
. Какие-нибудь мысли?Если вы хотите передать аргументы в середину сценария npm, а не просто добавлять их в конец, тогда встроенные переменные среды, похоже, будут работать хорошо:
Здесь
npm run dev
передает-w
флаг наблюдения babel, но одинnpm run start
раз запускает обычную сборку.источник
npm run dev
,npm start
Я использовал эту однострочную версию в прошлом, и через некоторое время вдали от Node.js пришлось недавно попытаться открыть ее заново. Подобно решению, упомянутому @francoisrv, он использует
node_config_*
переменные.Создайте следующий минимальный
package.json
файл:Запустите следующую команду:
Обратите внимание на следующий вывод:
Все это хорошо описано в официальной документации npm:
Примечание . Заголовок « Переменные среды» объясняет, что переменные внутри скриптов ведут себя не так, как определено в документации. Это верно, когда речь идет о чувствительности к регистру , а также о том, задан ли аргумент пробелом или знаком равенства .
Примечание. Если вы используете аргумент с дефисами, они будут заменены подчеркиванием в соответствующей переменной окружения. Например,
npm run example --foo-bar=baz
будет соответствовать${npm_config_foo_bar}
.Примечание. Для пользователей Windows, не относящихся к WSL, см. Комментарии @Doctor Blue ниже ... TL; DR заменить
${npm_config_foo}
на%npm_config_foo%
.источник
npm run argument --foo=bar
), но переменная не заменяется:"The value of --foo is '${npm_config_foo}'"
. Запуск на Windows 10, если это имеет значение, с версией 6.9.0 NPM.%npm_config_foo%
вместо этого. Чистая командная строка Windows / powershell здесь. (У меня тоже нет выбора.)Это на самом деле не отвечает на ваш вопрос, но вы всегда можете вместо этого использовать переменные окружения:
Затем в вашем файле server.js:
источник
Большинство приведенных выше ответов касаются простой передачи аргументов в ваш скрипт NodeJS, вызываемый npm. Мое решение для общего пользования.
Просто оберните скрипт npm
sh
вызовом интерпретатора оболочки (например ) и передайте аргументы как обычно. Единственное исключение - первый номер аргумента0
.Например, вы хотите добавить скрипт npm
someprogram --env=<argument_1>
, гдеsomeprogram
просто печатается значениеenv
аргумента:package.json
Когда вы запустите это:
источник
Из того, что я вижу, люди используют сценарии package.json, когда они хотели бы запустить сценарий более простым способом. Например, чтобы использовать
nodemon
тот, который установлен в локальных node_modules, мы не можем вызватьnodemon
напрямую из cli, но мы можем вызвать его с помощью./node_modules/nodemon/nodemon.js
. Итак, чтобы упростить эту долгую печать, мы можем поместить это ...... затем вызовите
npm start
для использования 'nodemon', у которого app.js является первым аргументом.То, что я пытаюсь сказать, если вы просто хотите запустить свой сервер с помощью
node
команды, я не думаю, что вам нужно использоватьscripts
. Печатаниеnpm start
илиnode app.js
же усилия.Но если вы хотите использовать
nodemon
и хотите передать динамический аргумент, не используйтеscript
. Попробуйте вместо этого использовать символическую ссылку.Например, используя миграцию с
sequelize
. Я создаю символическую ссылку ...ln -s node_modules/sequelize/bin/sequelize sequelize
... И я могу передать любой аргумент, когда я называю это ...
так далее...
На данный момент, использование символической ссылки - лучший способ, который я мог понять, но я не думаю, что это лучшая практика.
Я также надеюсь на ваше мнение на мой ответ.
источник
Примечание: этот подход изменяет ваш
package.json
на лету, используйте его, если у вас нет альтернативы.Мне пришлось передать аргументы командной строки в мои сценарии, которые были что-то вроде:
Итак, это означает, что я запускаю свое приложение с
npm run start
.Теперь, если я хочу передать некоторые аргументы, я бы начал с:
Что это делает:
npm run build && npm run watch -- --config=someConfig
. Проблема в том, что он всегда добавляет аргументы в конец скрипта. Это означает, что все цепочечные сценарии не получают эти аргументы (аргументы могут быть или не быть обязательными для всех, но это другая история). Кроме того, при вызове связанных сценариев эти сценарии не будут получать переданные аргументы. то естьwatch
скрипт не получит переданные аргументы.Производственное использование моего приложения в качестве
.exe
, так что передача аргументов в exe работает нормально, но если вы хотите сделать это во время разработки, это становится проблематичным.Я не мог найти какой-либо правильный способ достичь этого, поэтому я попробовал именно это.
Я создал файл javascript:
start-script.js
на родительском уровне приложения у меня есть «default.package.json», и вместо того, чтобы поддерживать «package.json», я поддерживаю «default.package.json». Цельstart-script.json
состоит в том, чтобы прочитатьdefault.package.json
, извлечьscripts
и найти иnpm run scriptname
затем добавить переданные аргументы к этим сценариям. После этого он создаст новыйpackage.json
и скопирует данные из default.package.json с измененными сценариями, а затем вызоветnpm run start
.Теперь вместо того, чтобы делать
npm run start
, я делаюnode start-script.js --c=somethis --r=somethingElse
Начальный прогон выглядит хорошо, но не был тщательно протестирован. Используйте его, если вам нравится разработка приложений.
источник
Я нашел этот вопрос, когда пытался решить свою проблему с помощью команды sequelize seed: generate cli:
Позвольте мне перейти к сути. Я хотел бы иметь короткую команду сценария в моем package.json файл и одновременно предоставить аргумент --name
Ответ пришел после нескольких экспериментов. Вот моя команда в package.json
... и вот пример запуска его в терминале для генерации начального файла для пользователя
FYI
источник
-- --arg1, ...
?npm run script_target - <аргумент> По сути, это способ передачи аргументов командной строки, но он будет работать только в том случае, если в скрипте запущена только одна команда, например, я запускаю команду, т.е. npm run start - 4200
Это будет выполняться для передачи параметров командной строки, но что если мы запустим более одной команды вместе, например, npm, запустите build c: / workspace / file
но он будет интерпретировать как это при выполнении copy c: / file && ng build c: / work space / file, и мы ожидаем что-то вроде этого копии c: / file c: / work space / file && ng build
Примечание: - поэтому параметр командной строки работает только в том случае, если в сценарии только одна команда.
Я прочитал некоторые ответы выше, в которых некоторые из них пишут, что вы можете получить доступ к параметру командной строки, используя символ $, но это не сработает
источник
Я знаю, что уже есть утвержденный ответ, но мне нравится этот подход JSON.
Обычно у меня есть 1 вариант, такой как имя проекта, поэтому я нахожу это быстрым и простым.
Также у меня часто есть что-то подобное в моем package.json
И, будучи жадным, я хочу "все это", NODE_ENV и линейку CMD.
Вы просто получаете доступ к таким вещам в своем файле (в моем случае local.js)
Вам просто нужно, чтобы этот бит был выше (я использую версию 10.16.0)
Anyhoo, вопрос уже ответил. Мысль, которой я поделюсь, поскольку я использую этот метод много.
источник