package.json版本和Teamcity

3
我们使用TeamCity进行构建和部署,作为这个过程的一部分,我们希望TeamCity定义package.json文件中的版本号。我们以前使用gulp-bump来增加版本号,但是TeamCity没有基于package.json文件中的详细信息进行构建编号。
因此,有没有一种简单的方法可以让TC更新package.json文件中的特定版本号?我知道我可以通过某种方式传递一个变量给gulp,并让它设置package.json文件的版本号,但我希望有更自动化的方法来完成这个过程。
4个回答

4
您可以在构建步骤部分的 package.json 中使用此命令轻松更改该命令。
npm version "1.0.%build.number%" --allow-same-version

--allow-same-version用于处理重复版本。


当我尝试运行这个命令时,npm 会尝试提交更改到 git 存储库,但失败并显示以下错误信息: npm ERR! error: object directory /TeamCity/buildAgent/work/ae09b07f727ad1af/.git/objects/C:\TeamCity\buildAgent\system\git\git-39B46704.git\objects does not exist; check .git/objects/info/alternates npm ERR! fatal: could not parse HEAD - Noy Oliel

2

我刚刚在 TeamCity 中添加了一个命令行构建步骤,具体如下:


call npm install -g json
call json -I -f package.json -e "this.version='1.0.%build.number%'"

这将会根据团队城市构建号来调整您的补丁号。"Original Answer"翻译成"最初的回答"。

1
这取决于你对自动化的定义。在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 中。”

1
在TeamCity中,我发现使用PowerShell对package.json进行查找和替换要容易得多(在尝试了各种技术后)。
添加一个Powershell构建步骤:
$packageFile = "D:\PathToPackageFile\package.json"
(Get-Content $packageFile).replace('"version": "0.0.0"', '"version": "%build.number%"') 
| Set-Content $packageFile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接