2016-03-09 128 views
0

我们正在使用TeamCity来进行构建和部署,作为其中的一部分,我们希望TeamCity在package.json文件中定义版本号。我们历史上使用的是gulp-bump,它会影响版本号,但是TeamCity没有根据package.json文件中的详细信息建立它的内部版本号。package.json版本和团队城市

那么有没有一种简单的方法让TC用特定的版本号更新package.json?我知道我可以通过一个var以某种方式吞咽,并获得它设置package.json版本的方式,但我希望有一个更“自动”的方式来做到这一点。

回答

1

这取决于您对自动化的定义。 TeamCity中没有任何构建功能来更新使用TeamCity 9的各种.json文件,它们吞噬/缓冲等等。

和你一样我使用gulp-bump来设置版本号,但是我找到了一种方法来设置版本号使用teamcity版本号在package.json文件中。我使用var $ = require('gulp-load-plugins')({lazy:true});所以如果你看到$符号这就是为什么

我也是用yargs命令行

这是我现在用的是一口任务看,我已经把它设置为我的邮件构建的依赖任务。

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上的内部版本号。

所以如果从节点从命令行调用它,它会

gulp build --version=2.3.4 

有一个疑难杂症。如果通过require语句使用package.json,则该值将被缓存,并且在使用该文件时可能无法获得正确的版本。使用require语句导致了我的问题,因为我最初努力确定为什么它使用以前的内部版本号而不是新的内部版本号。

因此我创建了一个新的功能加载文件时我需要阅读的内容,

function getPackageJson() { 
    return JSON.parse(fs.readFileSync('./package.json')); 
} 

在我的TeamCity的构建,我必须使用咕嘟咕嘟亚军类型生成步骤。对于命令我只有“建立”

而且我有额外的命令行下面的参数

--version=%build.number% 

这对我将在的package.json版本。如果您使用的是鲍尔等,那么只需将其他json文件添加到config.packages