这取决于你对自动化的定义。在TeamCity 9中,没有构建功能可以更新使用gulp / bower等工具的各种.json文件。像您一样,我正在使用gulp-bump设置版本号,但我已经找到了一种使用teamcity版本号设置package.json文件内部版本号的方法。FYI,我使用var $ = require('gulp-load-plugins')({ lazy: true });所以如果您看到$符号,那就是原因。我还使用yargs从命令行读取。这就是我正在使用的gulp任务,并且我已将其设置为我的邮件构建任务的依赖项。
var args = require('yargs').argv;
var fs = require('fs');
gulp.task('setVersion', function () {
var msg = 'Setting version';
var version = args.version;
var options = {};
if (version) {
options.version = version;
msg += ' to ' + version;
}
log(msg);
return gulp
.src(config.packages)
.pipe($.print())
.pipe(version ? $.bump(options) : $.util.noop())
.pipe(gulp.dest(config.dest.root));
});
这是我的配置。它被缩写为只显示必要的内容。
module.exports = function () {
var root = './';
var config = {
dest: {
root: root,
},
packages: [
'./package.json'
]
};
return config;
};
我检查是否传递了版本,因为在开发机器上执行gulpfile时,不需要设置版本号,因为我只关心TeamCity上的构建编号。
所以如果你从node命令行调用它,它将是
gulp build --version=2.3.4
如果您通过require语句使用package.json,则该值将被缓存,当您使用该文件时可能无法获取正确的版本。使用require语句会导致问题,因为我最初很难确定它为什么使用先前的构建编号而不是新的构建编号。
因此,我创建了一个新函数,在需要读取内容时加载文件。
function getPackageJson() {
return JSON.parse(fs.readFileSync('./package.json'));
}
在我的TeamCity构建中,我使用了Gulp运行器类型的构建步骤。对于命令,我只有"build"。
并且我有以下附加命令行参数
--version=%build.number%
这段话的意思是:“这个命令可以在 package.json 文件中设置版本。如果你使用的是 bower 等工具,则只需将额外的 json 文件添加到 config.packages 中。”