Gulp 任务 - 无法设置变量值

Gulp task - unable to set variable value

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

这是我目前的代码:

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"
};

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

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

谢谢

您的 Gulpfile 有几个问题:

  1. 您的 banner 变量已初始化 您的任何任务甚至被定义之前,更不用说被执行了。这意味着当你初始化 bannercommit 仍然是 undefined
  2. gulp.task 需要一个函数作为任务主体。但是,您的 Gulpfile 中 get-git-info 的任务主体是 getGitInfo()。这意味着您 执行 getGitInfo 函数并将该函数调用 的 return 值分配为 get-git-info。在你的情况下是 undefined.
  3. 即使您已将 getGitInfo 函数本身指定为任务主体(而不是其 return 值),它仍然无法工作,因为 git.short() 是异步的。这意味着 get-git-info returns 和 add-header 是 运行 before 你对 git.short() 的回调函数被调用提交 ID.

这是解决所有这三个问题的解决方案:

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 可用就会调用该回调。这向 gulp 表明 get-git-info 已完成并且 runSequence 可以继续执行 add-header 任务。