我正在使用git-rev
,gulp-header
和run-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"
};
我说的是提交,而不是时间戳。我稍后会担心时间戳。
知道我在这里做错了什么吗?
感谢
答案 0 :(得分:1)
您的Gulpfile存在一些问题:
banner
变量已初始化,更不用说已经执行了。这意味着初始化commit
时undefined
仍为banner
。 gulp.task
期望一个函数作为任务主体。但是,Gulpfile中get-git-info
的任务正文为getGitInfo()
。这意味着您执行 getGitInfo
函数,并将该函数调用的返回值指定为get-git-info
的任务主体。在您的情况下,undefined
。getGitInfo
函数本身指定为任务正文(而不是其返回值),它仍然无法正常工作,因为git.short()
是异步的。这意味着get-git-info
返回并且add-header
在使用commit-id调用调用git.short()
的回调函数之前运行。这是解决所有这三个问题的解决方案:
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/'))
});
banner
现在是一个函数,因此commit
变量在初始化之前无法访问。getGitInfo
消失了。相反,匿名函数被用作get-git-info
的任务主体,所以我们实际上在这里分配一个函数已经很明显了。done
,一旦commit-id可用,就会调用它。这表示get-git-info
已完成,runSequence
可以继续执行add-header
任务。