Gulp任务 - 无法设置变量值

时间:2016-02-22 15:34:47

标签: gulp gulp-header

我正在使用git-revgulp-headerrun-sequence并尝试在构建过程中自动向app.js文件添加一些信息以及 - git提交号。

这是我到目前为止的代码:

var runSequence = require('gulp-run-sequence');
var git = require('git-rev');
var header = require('gulp-header');
var pkg = require('./info.json');

var paths = {addHeader: ['./www/js/app.js'], ...}

var commit, timestamp;
function getGitInfo() {
    git.short(function (str) {
        commit = str;
        console.log(str);
    });
};

var banner = ['"commit":"' + commit + '",',
    '"timestamp":"' + timestamp + '",',
    '"appVersion":"<%= pkg.appVersion %>",',
    '"appReleaseDate":"<%= pkg.appReleaseDate %>"',
    '};\n',
    ''].join('\n');

gulp.task('get-git-info', getGitInfo());
gulp.task('add-header', function () {
    return gulp.src(paths.addHeader)
        .pipe(header(banner, {pkg: pkg}))
        .pipe(gulp.dest('./www-dev/js/'))
});

gulp.task('build', function (){
  runSequence('get-git-info','add-header');
})

控制台结果是对的,我有提交号,但在app.js中,我得到的都是未定义的:

aboutPage={
"appVersion":"5.0.0",
"appReleaseDate":"10/02/2016",
"commit":"undefined",
"timestamp":"undefined"
};

我说的是提交,而不是时间戳。我稍后会担心时间戳。

知道我在这里做错了什么吗?

感谢

1 个答案:

答案 0 :(得分:1)

您的Gulpfile存在一些问题:

  1. 在任何任务被定义之前,您的banner变量已初始化,更不用说已经执行了。这意味着初始化commitundefined仍为banner
  2. gulp.task期望一个函数作为任务主体。但是,Gulpfile中get-git-info的任务正文为getGitInfo()。这意味着您执行 getGitInfo函数,并将该函数调用的返回值指定为get-git-info的任务主体。在您的情况下,undefined
  3. 即使您已将getGitInfo函数本身指定为任务正文(而不是其返回值),它仍然无法正常工作,因为git.short()是异步的。这意味着get-git-info返回并且add-header在使用commit-id调用调用git.short()的回调函数之前运行
  4. 这是解决所有这三个问题的解决方案:

    function banner() {
        return [
            '"commit":"' + commit + '",',
            '"timestamp":"' + timestamp + '",',
            '"appVersion":"<%= pkg.appVersion %>",',
            '"appReleaseDate":"<%= pkg.appReleaseDate %>"',
            '};\n',
            ''
        ].join('\n');
    }
    
    gulp.task('get-git-info', function(done) {
        git.short(function (str) {
            commit = str;
            console.log(str);
            done();
        });
    });
    
    gulp.task('add-header', function () {
        return gulp.src(paths.addHeader)
            .pipe(header(banner(), {pkg: pkg}))
            .pipe(gulp.dest('./www-dev/js/'))
    });
    
    1. banner现在是一个函数,因此commit变量在初始化之前无法访问。
    2. getGitInfo消失了。相反,匿名函数被用作get-git-info的任务主体,所以我们实际上在这里分配一个函数已经很明显了。
    3. 匿名函数接受回调done,一旦commit-id可用,就会调用它。这表示get-git-info已完成,runSequence可以继续执行add-header任务。