当另一个任务依赖于它时,将参数传递给gulp任务

时间:2016-04-29 14:00:24

标签: node.js gulp

让我说我有这样的事情:

var gulp = require("gulp"),
    argv = require("yargs").argv;

gulp.task("config", function (cb) {
    "use strict";

    if (argv.ftp) {
        console.log("Reading FTP settings...");
    } elseif (argv.sync) {
        console.log("Reading Sync settings..."):
    }
});

gulp.task("ftp", ["config"], function(cb) {
    console.log("FTPing...");
});

gulp.task("sync", ["config"], function(cb) {
    console.log("Syncing...");
});

以下是这个想法:

  • 用户运行gulp ftp,它依赖于gulp config
  • gulp-config检查ftp中与config.json相关的一些值,并提示用户输入任何遗漏的内容。
  • gulp ftp然后继续执行它的任务。

可替换地,

  • 用户运行gulp sync,它依赖于gulp config
  • gulp-config检查sync中与config.json相关的一些值,并提示用户输入任何遗漏的内容。
  • gulp sync然后继续执行它的任务。

我将这一切都运行得很好,除了为了使config任务正常工作作为ftpsync的依赖项,我必须运行{{1} }或gulp ftp --ftp。我想要做的是告诉gulp sync --sync如果它作为gulp config的依赖项运行,则假设gulp ftp标志,并且它作为{{1}的依赖项运行假设--ftp标志。

所以我的问题是,有没有办法告诉gulp任务何时是另一个人的依赖?由于gulp sync的依赖关系而导致--sync运行时,有没有办法在gulp-config开头检查?

更新1:我有想法做gulp-ftp之类的事情,其中​​gulp-config是一个全局变量,可以在if (argv.ftp || config === "ftp")config中设置{1}}任务,但我意识到这将无法工作,因为在ftp任务完成之后,变量才会被设置。我会继续研究......

2 个答案:

答案 0 :(得分:1)

  

我想要做的是告诉gulp ftp如果它作为--ftp的依赖项运行,则假定gulp sync标志,并且&# 39; s作为--sync的依赖关系运行,假设seq标志。

你实际上可以这样做,虽然我不愿意推荐它,因为它不是官方记录的Gulp API的一部分。

Gulp从orchestrator继承其任务运行功能,它将任务的执行顺序存储在数组gulp ftp中。在命令行上运行seq会产生['config', 'ftp']数组config

因此,如果ftp作为ftp的依赖项运行,它将显示在seq数组中的config之前。您只需在gulp.task("config", function () { if (gulp.seq.indexOf('config') < gulp.seq.indexOf('ftp') || argv.ftp) { console.log("Reading FTP settings..."); } if (gulp.seq.indexOf('config') < gulp.seq.indexOf('sync') || argv.sync) { console.log("Reading Sync settings..."); } }); 任务中检查此情况:

ftp

另一个选项是检查命令行上是否已调用yargsargv._将非选项命令行参数放入gulp.task("config", function () { if (argv._.indexOf('ftp') >= 0 || argv.ftp) { console.log("Reading FTP settings..."); } if (argv._.indexOf('sync') >= 0 || argv.sync) { console.log("Reading Sync settings..."); } });

ftp

但是,如果在命令行中未显式调用ftp,则无效。如果{{1}}本身被执行,可能会发生这种情况,因为另一个任务依赖于它。

答案 1 :(得分:0)

以下是重构的解决方案:

var gulp = require("gulp");

function config(type) {
    "use strict";
    if (type == 'ftp') {
        console.log("Reading FTP settings...");
    } else if (type == 'sync') {
        console.log("Reading Sync settings...");
    }   
}

gulp.task("config-ftp", function () {
    config('ftp');
});

gulp.task("config-sync", function () {
    config('sync');
});

gulp.task("ftp", ["config-ftp"], function(cb) {
    console.log("FTPing...");
});

gulp.task("sync", ["config-sync"], function(cb) {
    console.log("Syncing...");
});