Передача параметров в скрипты package.json [duplicate]

Чтобы получить определенную часть итерабельного (например, списка), вот пример:

variable[number1:number2]

В этом примере положительное число для числа 1 - сколько компонентов вы снимаете с фронт. Отрицательное число - это полная противоположность, сколько вы держите от конца. Положительное число для числа 2 указывает, сколько компонентов вы намерены сохранить с самого начала, а отрицательным является то, сколько вы намерены взлететь с конца. Это несколько противоречит интуитивному, но вы правы, полагая, что нарезка списка чрезвычайно полезна.

410
задан arnemart 20 July 2012 в 15:02
поделиться

10 ответов

Редактировать 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 становится переопределенным).

583
ответ дан jakub.g 1 September 2018 в 07:51
поделиться

Вы попросили запустить что-то , например npm start 8080. Это возможно без необходимости изменять script.js или файлы конфигурации следующим образом.

Например, в вашем "scripts" значении JSON включить -

"start": "node ./script.js server $PORT"

И затем из command-line:

$ PORT=8080 npm start

Я подтвердил, что это работает с использованием bash и npm 1.4.23. Обратите внимание, что для этой работы не требуется решить проблему GitHub npm # 3494 .

139
ответ дан cjerdonek 1 September 2018 в 07:51
поделиться

Это не отвечает на ваш вопрос, но вы всегда можете использовать переменные среды:

"scripts": {
    "start": "PORT=3000 node server.js"
}

Затем в файле server.js:

var port = process.env.PORT || 3000;
5
ответ дан DrunkenBeetle 1 September 2018 в 07:51
поделиться

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);

22
ответ дан Gregory Houllier 1 September 2018 в 07:51
поделиться

Из того, что я вижу, люди используют скрипты package.json, когда им проще запускать скрипт. Например, чтобы использовать nodemon, установленный в local node_modules, мы не можем вызвать nodemon непосредственно из cli, но мы можем вызвать его, используя ./node_modules/nodemon/nodemon.js. Таким образом, чтобы упростить эту длинную типизацию, мы можем поместить это ...


    ...

    scripts: {
      'start': 'nodemon app.js'
    }

    ...

... затем вызвать npm start, чтобы использовать «nodemon», у которого app.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 */

и т. д. ...

На данный момент использование символической ссылки - лучший способ, который я мог бы выяснить, но я действительно не думаю, что это лучшая практика.

Я также надеюсь на ваш мнение моего ответа.

3
ответ дан Kiddo 1 September 2018 в 07:51
поделиться

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

11
ответ дан Nobita 1 September 2018 в 07:51
поделиться

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

В package.json:

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

В cool.js:

 console.log({ myVar: process.env.npm_config_myVar });

В CLI:

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

59
ответ дан sarink 1 September 2018 в 07:51
поделиться

Я нашел этот вопрос, пока я пытался решить свою проблему при запуске sequelize seed: generate cli command:

node_modules/.bin/sequelize seed:generate --name=user

Позвольте мне понять. Я хотел иметь короткую команду сценария в моем файле package.json и предоставить аргумент --name в то же время

. Ответ пришел после некоторых экспериментов. Вот моя команда в package.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
0
ответ дан Serge Seletskyy 1 September 2018 в 07:51
поделиться

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

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

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

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

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

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

Как упоминалось jakub.g , вы можете альтернативно set params в config вашего 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");
}
41
ответ дан steven iseki 1 September 2018 в 07:51
поделиться

Используйте 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] - исполняемый файл (узел), process.argv[1] - ваш скрипт.

Протестировано с помощью npm v5.3.0 и узел v8.4.0

14
ответ дан Stphane 1 September 2018 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: