Передать аргумент из скрипта в задачу gulp

У меня есть package.json скрипты со следующей структурой:

"scripts": {
    "watch:build": "tsc --watch",
    "watch:server": "nodemon ./src/app.js --watch 'app'",
    "build": "tsc && gulp do_something",
    "start": "npm-run-all clean build --parallel watch:build", 
    "watch:server --print-label"
}

Я хотел бы запустить приложение как npm run start with_argument и передать его скрипту build для выполнения действий в задаче gulp на основе этого аргумента.

Я прочитал много учебников и статей, но безрезультатно. Можно каким-то образом передать аргумент из одного скрипта в другой (который запускает задачу gulp).

Заранее спасибо!


person user3270899    schedule 05.10.2018    source источник


Ответы (1)


npm-run-all предоставляет собственный механизм обработки аргументов с использованием заполнителей в npm-скриптах, как указано в разделе Заполнители аргументов его документации, найденной здесь.

npm-скрипт:

Учитывая ваш текущий npm-скрипт с именем start, вам нужно переопределить его следующим образом:

"scripts": {
  ...
  "start": "npm-run-all clean \"build -- {@}\" --parallel watch:build --"
  ...
}

Примечания:

  • -- {@} необходимо добавить после build.1
  • build -- {@} должен быть заключен в экранированные двойные кавычки \"...\"
  • -- также необходимо добавить после последнего вызова скрипта, а именно: watch:build

gulpfile.js

Чтобы получить аргументы, переданные через интерфейс командной строки внутри вашего gulpfile.js, вам необходимо использовать узлы process.argv

В целях демонстрации допустим, что наш gulpfile.js выглядит следующим образом:

var gulp = require('gulp');
var args = process.argv.splice(3, process.argv.length - 3);

gulp.task('doSomething', function() {

  // For testing purposes...
  if (args.indexOf('--foo') > -1) {
    console.log('--foo was passed via the CLI.')
  }

  if (args.indexOf('--quux') > -1) {
    console.log('--quux was passed via the CLI.')
  }
});

Примечания:

  1. Первые три элемента в узлах process.argv:

    • The path to the executable running the JavaScript file.
    • Путь исполняемого файла JavaScript.
    • Имя задачи gulp, т.е. doSomething
  2. Однако нас интересуют только элементы, начиная с четвертого элемента в массиве, поскольку это будут аргументы, передаваемые через CLI. Строка, которая гласит:

    var args = process.argv.splice(3, process.argv.length - 3);
    

    создает переменную args и назначает массив, содержащий каждый аргумент, переданный через CLI, т. е. мы опускаем первые три вышеупомянутых элемента в пункте 1 выше, используя массивы splice().


Запуск скрипта start:

Вы вызываете свой сценарий запуска через CLI следующим образом:

$ npm start -- --foo --quux

Примечание. Вы должны указать -- перед npm start, прежде чем указывать свои собственные аргументы.


Выход:

  • Используя надуманный gulpfile.js выше, в сочетании с вашими текущими скриптами, определенными в вашем package.json, и, конечно же, необходимые изменения, внесенные в ваш start скрипт. Когда вы бежите:

    $ npm start -- --foo --quux
    

    вы увидите следующее, напечатанное на консоли:

    --foo was passed via the CLI.

    --quux was passed via the CLI.

  • Бег:

    $ npm start -- --quux
    

    вы увидите только следующее, напечатанное на консоли:

    --quux was passed via the CLI.

  • И, конечно же, бег:

    $ npm start
    

    Не печатает ни одно из сообщений, определенных в gulpfile.js.


Сноски:

1 -- {@} можно заменить на -- {1}, если вы собираетесь передать только один аргумент. Однако -- {@} обрабатывает несколько аргументов, поэтому его можно использовать и для одного аргумента.


person RobC    schedule 05.10.2018