根据参数使用不同来源的Gulp任务

jth*_*h41 29 javascript dry gulp yargs

我想用gulp完成一些简单的事情.我想编写一个通用方法,将文件从特定的源目录移动到输出目录.

假装我们有类似的东西

var args = require('yargs');
function transform-move-jsx-Development() 
{
  gulp.src(config.sourceJSX)
  .pipe(react, browserify, etc....)
  .pipe(gulp.dest(config.output_development));
};

function transform-move-jsx-Production() 
{
  gulp.src(config.sourceJSX)
  .pipe(react, browserify, etc....)
  .pipe(gulp.dest(config.output_production));
};

gulp.task('transform-move-jsx-Development', transform-move-jsx-Development);
gulp.task('transform-move-jsx-Production', transform-move-jsx-Production);

gulp.task('prod', [transform-move-jsx-Production]);
gulp.task('dev', ['transform-move-jsx-Development']);
Run Code Online (Sandbox Code Playgroud)

这两个任务:transform-move-jsx-Production和transform-move-jsx-Development除了输出目录外是相同的.我想让它更干(不要重复自己).我应该能够制作一个可以使用yarg参数的方法吗?在下一个例子中,我假装我可以将路径作为arg传递

所以我尝试使用yargs这样的东西

var args = require('yargs');

function transform-move-jsx() 
{ 
    return gulp.src(config.sourceJSX)
    .pipe(gulp.dest(args.outputDirectory));
};

gulp.task('dev', ['transform-move-jsx']);
Run Code Online (Sandbox Code Playgroud)

但是现在这需要我在命令行中为gulp调用添加参数

gulp dev --"path to output, etc."
Run Code Online (Sandbox Code Playgroud)

这显然不太可维护,因为我们从dev gulp任务中调用越来越多的gulp任务.反之亦然,因为我们不需要知道实现细节,比如运行时输出目录结构gulp dev

我可以做这样的事情:

function transform-move-jsx(destination) 
{ 
    return gulp.src(config.sourceJSX)
    .pipe(gulp.dest(destination));
};

function transform-move-jsx-Development() 
{
    transform-move-jsx("./output/development/");
};

function transform-move-jsx-Production() 
{
    transform-move-jsx("./output/production/");
};

gulp.task('transform-move-jsx-Development',transform-move-jsx-Development);
gulp.task('transform-move-jsx-Production', transform-move-jsx-Production);

gulp.task('prod',  transform-move-jsx-Production);
gulp.task('dev',  transform-move-jsx-Development);
Run Code Online (Sandbox Code Playgroud)

这似乎更好,因为它更灵活,但现在我的gulpfile充斥着几个不必要的功能.

有没有更好的办法 ?

小智 28

你第二次尝试就走在了正确的轨道上,只需要使用一些DRY闭包

function createTransformTaskClosure (destination) {
    return function () {
        return gulp.src(config.sourceJSX)
                   .pipe(gulp.dest(destination));
    };
}

gulp.task('dev', createTransformTaskClosure(config.output_development));
gulp.task('prod', createTransformTaskClosure(config.output_production));
Run Code Online (Sandbox Code Playgroud)

  • 使用**gulp 4**,我不得不使用这个任务签名`gulp.task('dev',()=> {return createTransformTaskClosure(config.output_development)}`); (4认同)