Чтобы получить определенную часть итерабельного (например, списка), вот пример:
variable[number1:number2]
В этом примере положительное число для числа 1 - сколько компонентов вы снимаете с фронт. Отрицательное число - это полная противоположность, сколько вы держите от конца. Положительное число для числа 2 указывает, сколько компонентов вы намерены сохранить с самого начала, а отрицательным является то, сколько вы намерены взлететь с конца. Это несколько противоречит интуитивному, но вы правы, полагая, что нарезка списка чрезвычайно полезна.
Редактировать 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"
И затем из command-line:
$ PORT=8080 npm start
Я подтвердил, что это работает с использованием bash и npm 1.4.23. Обратите внимание, что для этой работы не требуется решить проблему GitHub npm # 3494 .
Это не отвечает на ваш вопрос, но вы всегда можете использовать переменные среды:
"scripts": {
"start": "PORT=3000 node server.js"
}
Затем в файле server.js:
var port = process.env.PORT || 3000;
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);
Из того, что я вижу, люди используют скрипты 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 */
и т. д. ...
На данный момент использование символической ссылки - лучший способ, который я мог бы выяснить, но я действительно не думаю, что это лучшая практика.
Я также надеюсь на ваш мнение моего ответа.
Если вы хотите передать аргументы в середине скрипта 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
запускает регулярную сборку один раз.
Вы также можете сделать это:
В 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
Я нашел этот вопрос, пока я пытался решить свою проблему при запуске 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
Ответ 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");
}
Используйте 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