Передача аргумента из сценария в задание глотка - PullRequest
0 голосов
/ 05 октября 2018

У меня есть 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на основании этого аргумента.

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

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

1 Ответ

0 голосов
/ 05 октября 2018

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

npm-скрипт:

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

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

Примечания:

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

gulpfile.js

Для полученияаргументы, передаваемые через CLI внутри вашего 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:

    • Путь к исполняемому файлу, на котором выполняется файл JavaScript.
    • Путь к исполняемому файлу 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}, если вы тольконамерены передать один аргумент.Тем не менее, -- {@} обрабатывает несколько аргументов, поэтому можно использовать его и для одного аргумента.


...