Gulp 任务 - 无法设置变量值
Gulp task - unable to set variable value
我正在使用 git-rev
、gulp-header
和 run-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 有几个问题:
- 您的
banner
变量已初始化 在 您的任何任务甚至被定义之前,更不用说被执行了。这意味着当你初始化 banner
时 commit
仍然是 undefined
。
gulp.task
需要一个函数作为任务主体。但是,您的 Gulpfile 中 get-git-info
的任务主体是 getGitInfo()
。这意味着您 执行 getGitInfo
函数并将该函数调用 的 return 值分配为 get-git-info
。在你的情况下是 undefined
.
- 即使您已将
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/'))
});
banner
现在是一个函数,因此 commit
变量在初始化之前不会被访问。
getGitInfo
不见了。相反,一个匿名函数被用作 get-git-info
的任务主体,所以很明显我们实际上在这里分配了一个函数。
- 匿名函数接受一个回调
done
,一旦 commit-id 可用就会调用该回调。这向 gulp 表明 get-git-info
已完成并且 runSequence
可以继续执行 add-header
任务。
我正在使用 git-rev
、gulp-header
和 run-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 有几个问题:
- 您的
banner
变量已初始化 在 您的任何任务甚至被定义之前,更不用说被执行了。这意味着当你初始化banner
时commit
仍然是undefined
。 gulp.task
需要一个函数作为任务主体。但是,您的 Gulpfile 中get-git-info
的任务主体是getGitInfo()
。这意味着您 执行getGitInfo
函数并将该函数调用 的 return 值分配为get-git-info
。在你的情况下是undefined
.- 即使您已将
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/'))
});
banner
现在是一个函数,因此commit
变量在初始化之前不会被访问。getGitInfo
不见了。相反,一个匿名函数被用作get-git-info
的任务主体,所以很明显我们实际上在这里分配了一个函数。- 匿名函数接受一个回调
done
,一旦 commit-id 可用就会调用该回调。这向 gulp 表明get-git-info
已完成并且runSequence
可以继续执行add-header
任务。