将参数从脚本传递到gulp任务

时间:2018-10-05 08:01:40

标签: npm gulp arguments package.json npm-scripts

我有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任务)。

谢谢!

1 个答案:

答案 0 :(得分:1)

npm-run-all提供了一种自己的自定义机制,可通过使用npm-scripts中的占位符来处理自变量,如其here文档中的 Argument Placeholders 部分所述。 / p>

npm-script:

鉴于您当前的名为start的npm脚本,您需要按以下方式重新定义它:

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

注释:

    必须在-- {@}之后添加
  • build 1
  • build -- {@}必须用转义的双引号\"...\"
  • 包装
  • --也必须在上一次脚本调用之后添加,即:watch:build

gulpfile.js

要获取在 gulpfile.js 中通过CLI传递的参数,您将需要使用节点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传递的每个参数的Array,即,我们使用Arrays splice()方法在上述第1点中省略了前面提到的前三个项。

    < / li>

运行您的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}。但是,-- {@}处理多个参数,因此也可以将其用于一个参数。