2016-11-04 37 views
0

我有以下项目结构(monorepo有许多包)如何使用gulp同步执行相同的任务,每个文件夹执行一次(在带有子包的monorepo中)?

/pkgA 
    gulpfile.js 
    /pkgB 
    gulpfile.js 
    /pkgC 
    gulpfile.js 

每个包都有它只是用来加载/shared/shared-gulp-tasks.js

重要一gulpfile.js:我们要保持这种独立性(这样我就可以运行gulp whatever只有给定的包,如果想要的话) - 即我不想从共享的gulp文件中删除现有的任务,我想重复使用它们。

如果我们想一次打造一切,我们同步运行一个任务是这样的:

bash for-each-package.sh "gulp package" 

这确实有点像

cd pkgA 
    gulp package 
    cd pkgB 
    gulp package 
    cd pkgC 
    gulp package 

然而,这是缓慢的,因为我每个包从头开始执行gulp可执行文件,每次加载吞吐和所有需要的代码需要大约3秒。(我们有20多个子包)。

我要的是有根的gulpfile.js定义的任务这将让我做

gulp package-all 

的代码应该是这样的:

gulp.task('package-all', function(done) { 
    ['pkgA', 'pkgB', 'pkgC'].forEach(function(pkgName) { 
     process.chdir(path.join(__dirname, pkgName)); 
     // need to run 'package' task here, synchronously 
     // gulp.start('package'); is async 
    }); 
    done(); 
    } 

注意,文件夹专用package任务已经在共享的gulpfile中声明,我不想重写它。

问题是我想同步执行此操作,并且当所有文件夹完成处理后,请致电done()

选项探索至今:

  • gulp.run已被弃用,gulp.start是未公开的,一般不建议 他们不要在此情况下做什么工作(异步)

  • runSequence看起来很有希望,但我怎么会多次运行相同的任务,每个文件夹,与cd到该文件夹​​之前

我知道我所要求的是与“吞噬方式”正交,但我不想重写我所有的任务。

什么是实现我的目标的好方法?

回答

1

最后我用run-sequence和创建假冒的任务(不知道是否有更简单的方法解决了这个问题 - 顺便说一句,似乎一饮而尽任务不能是匿名的,你不能仅仅通过功能run-sequence,你需要通过字符串名称),然后是这些任务中的一个序列(并在序列末尾传递done)。

gulpfile.js

var runSequence = require('run-sequence'); 
var gulp = require('gulp'); 
require('./shared-gulp-tasks')(gulp); 

var folders = ['pkgA', 'pkgB', 'pkgC']; // this array comes from external helper method which reads it from disk 

function registerTaskForAllFolders(wrappedTaskName) { 
    var tasksToExecute = []; 

    folders.forEach(function(folderName) { 
    var taskName = wrappedTaskName + '_' + folderName; 
    gulp.task(taskName, function(done) { 
     console.log(folderName); 
     process.chdir(path.join(__dirname, folderName)); 
     runSequence(wrappedTaskName, done); 
    }); 
    tasksToExecute.push(taskName); 
    }); 

    gulp.task(wrappedTaskName + '-all', function(done) { 
    tasksToExecute.push(done); 
    runSequence.apply(null, tasksToExecute); 
    }); 
} 

// this registers a task called 'nothing-all' 
registerTaskForAllFolders('nothing'); 

// this registers a task called 'clean-all' 
registerTaskForAllFolders('clean'); 

// this registers a task called 'package-all' 
registerTaskForAllFolders('package'); 

共享吞-tasks.js

module.exports = function(gulp) { 
    gulp.task('nothing', function(done) { 
    console.log('doing nothing in ' + process.cwd()); 
    done(); 
    }); 
} 

终端

gulp nothing-all 

输出

[17:08:51] Starting 'nothing-all'... 
[17:08:52] Starting 'nothing_pkgA'... 
[17:08:52] Starting 'nothing'... 
doing nothing in d:\git\myproject\pkgA 
[17:08:52] Finished 'nothing' after 171 μs 
[17:08:52] Finished 'nothing_pkgA' after 2.23 ms 
[17:08:52] Starting 'nothing_pkgB'... 
[17:08:52] Starting 'nothing'... 
doing nothing in d:\git\myproject\pkgB 
[17:08:52] Finished 'nothing' after 2.03 ms 
[17:08:52] Finished 'nothing_pkgB' after 11 ms 
[17:08:52] Starting 'nothing_pkgC'... 
[17:08:52] Starting 'nothing'... 
doing nothing in d:\git\myproject\pkgC 
[17:08:52] Finished 'nothing' after 1.93 ms 
[17:08:52] Finished 'nothing_pkgC' after 11 ms 
[17:08:52] Finished 'nothing-all' after 345 ms 
相关问题