【问题标题】:How can I achieve this using gulp?如何使用 gulp 实现这一目标?
【发布时间】:2015-06-21 12:11:00
【问题描述】:

我正在枚举目录中的子目录。对于每个子目录,我想应用一些 gulp 活动,例如更少的编译,然后创建一个特定于该子目录的输出文件。

我希望 gulp 过程继续进行,因为稍后需要执行进一步的转换步骤。

有人可以帮助我了解如何在“gulp 管道”中途创建这些文件吗?

【问题讨论】:

  • 这些步骤本身似乎都不是特别具有挑战性;哪一个给你带来了麻烦?

标签: javascript node.js stream gulp


【解决方案1】:

这似乎很有趣,而且 gulp 没有任何限制。

我将给你详细的例子,我是如何成功完成这样一个任务的。

假设您有目录 A。子目录 childA、childB 和 childC 包含在目录 A 中。所以基本上你的树结构看起来像:

directoryA
--childA
--childB
--childC

我一直在寻找一种灵活的解决方案,因此我建议在每个子目录中包含一个 JSON 文件来命名您想要运行的任务。使用 fs 您可以访问这些文件。您还可以使用 run-sequence 同步执行 gulp 任务。

出于演示目的,在 childA 子目录中放置一个名为 manifest.json 的文件。

Manifest.json 包含以下声明:

{
    "filesToProccess" : ["./childA/*.js", "./childB/*.js"],
    "tasksToRun" :["taskA", "taskB"]
}

最后 gulpfile 会这样:

'use strict';

//dependencies declared into package.json
//install them using npm

var gulp = require('gulp'),
    fs = require('fs'),
    runSequence = require('run-sequence'),
    path = require('path');


//these two array will keep the actions you have included into manifest file.
var filesHolder = [], tasksHolder = [];

gulp.task('taskA', function () { 
    return gulp.src(filesHolder)
    .pipe(whatever)
    .pipe(gulp.dest('whatever')); //chailed actions 
});


gulp.task('taskB', function () { 
    return gulp.src(filesHolder)
    .pipe(whatever)
    .pipe(gulp.dest('whatever')); 
});

//a simple utility function to read all subdirectories of directoryA

function getDirectories(srcpath) {
  return fs.readdirSync(srcpath).filter(function(file) {
    return fs.statSync(path.join(srcpath, file)).isDirectory();
  });
}



//finally insert the default gulp task
gulp.task('default', function(){

    var manifest;

    //map directory's A subdirectories
    var availableDirs = getDirectories("./directoryA");

    //finally loop the available subdirectories, load each manifest file and 
    availableDirs.forEach(function(subdir) {
        manifest = require("./directoryA/"+subdir+"manifest.json");
        filesHolder = manifest.filesToProccess;
        tasksHolder = manifest.tasksToRun;
        runSequence( tasksHolder , function () {
            console.log( " Task ended :" + tasksHolder + " for subdirectory : " + subdir); 
        });

    });

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多