首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在gulpfile中排序任务

在gulpfile中排序任务
EN

Stack Overflow用户
提问于 2017-04-19 17:12:00
回答 1查看 72关注 0票数 1

我想通过Gulp在我的项目中实现非常简单的任务链:

  1. 复制所有文件;
  2. 用值替换一些占位符;
  3. 缩小一些文件;

为此,我创建了具有以下主要任务的gulpfile:

代码语言:javascript
复制
gulp.task(tasks.build, [
          tasks.simplyCopy, 
          tasks.minifyXml, 
          tasks.minifyJs, 
          tasks.subst]);

这是一个相当简单和自我描述。

下面我写了完整的gulpfile.js:

代码语言:javascript
复制
var gulp       = require('gulp');
var prettyData = require('gulp-pretty-data');
var uglify     = require('gulp-uglify');
var renvy      = require('gulp-renvy');

var tasks = {
    simplyCopy: "simply-copy",
    minifyXml:  "minify-xml",
    minifyJs:   "minify-js",
    subst:      "renvy-subst",
    build:      "build"
};

// Collection of tasks
gulp.task(tasks.build, [tasks.simplyCopy, tasks.minifyXml, tasks.minifyJs, 
tasks.subst]);

// By this task sources simply copy to the destination
var destination = 'dist/';
gulp.task(tasks.simplyCopy, function () {
    gulp.src(['Source/**/*.*', '!Source/www/res/strings/*.*'], {base: 
'Source/www'})
    .pipe(gulp.dest(destination));
});

var stringsDestPath = 'dist/res/strings/';
var stringSrcPath   = 'Source/www/res/strings/';

// By this task some xml files minify
gulp.task(tasks.minifyXml, [tasks.simplyCopy], function() {
    gulp.src(stringSrcPath + '*.xml')
        .pipe(prettyData({
            type: 'minify',
            preserveComments: true,
            extensions: {
                'xlf': 'xml',
                'svg': 'xml'
            }
        }))
        .pipe(gulp.dest(stringsDestPath))
});

var placeholder = {
    '%version%': {'prod':'010.00',   'dev':'010.00'}
};


// By this task in some files placeholders replaces with value
gulp.task(tasks.subst, [tasks.minifyXml, tasks.minifyJs], function(){
    return gulp.src(stringsDestPath + '*.*')
        .pipe(renvy(placeholder, 'dev'))
        .pipe(gulp.dest(stringsDestPath));
});


// By this task some js files minify 
gulp.task(tasks.minifyJs, [tasks.simplyCopy], function () {
    gulp.src(stringSrcPath + '*.js')
        .pipe(uglify())
        .pipe(gulp.dest(stringsDestPath))
});

但我有这样意想不到的行为:

占位符的替换没有发生,但它正在执行。

代码语言:javascript
复制
[16:29:51] Using gulpfile C:\PDDirectory\Workspace\src\some_workbench\User_Part\gulpfile.js
[16:29:51] Starting 'simply-copy'...
[16:29:51] Finished 'simply-copy' after 17 ms
[16:29:51] Starting 'minify-xml'...
[16:29:51] Finished 'minify-xml' after 7.49 ms
[16:29:51] Starting 'minify-js'...
[16:29:51] Finished 'minify-js' after 5.84 ms
[16:29:51] Starting 'renvy-subst'...
[16:29:51] Finished 'renvy-subst' after 28 ms
[16:29:51] Starting 'build'...
[16:29:51] Finished 'build' after 5.66 ?s

执行sepparetly的任务tasks.subst工作良好,但在与其他任务的链中,我只看到执行复制和缩小的结果。为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-19 18:00:20

Place tasks.substtasks.build的唯一依赖项。

代码语言:javascript
复制
gulp.task(tasks.build, [tasks.subst]);

由于tasks.subst需要所有其他任务,所以排序应该是正确的,添加所有其他任务可能会导致排序问题。

来自文档

注意:在依赖项完成之前,任务是否正在运行?确保您的依赖项任务正确使用异步运行提示:接受回调或返回承诺或事件流。

为了确保任务依赖关系在执行之前得到满足,Gulp需要每个任务返回一个或承诺,或者调用参数

在您的示例中,以下任务应该只是return流:

  • tasks.minifyXml
  • tasks.minifyJs
  • tasks.simplyCopy

例如:

代码语言:javascript
复制
gulp.task(tasks.minifyXml, [tasks.simplyCopy], function(done) {
    // just return the task stream here
    return gulp.src(stringSrcPath + '*.xml')
        .pipe(prettyData({
            // ...
        }))
        .pipe(gulp.dest(stringsDestPath));
});

或者在无法返回流时使用回调:

代码语言:javascript
复制
gulp.task('somename', function(done) {

  // async function which does not return a stream like other gulp functions
  getFilesAsync(function(err, res) {
    // pass any errors to the callback
    if (err) return done(err);

    var stream = gulp.src(res)
      .pipe(minify())
      .pipe(gulp.dest('build'))
      .on('end', done); // use the callback when it's done
  });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43502069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档