【问题标题】:package.json versions and teamcitypackage.json 版本和 teamcity
【发布时间】:2016-06-23 13:28:41
【问题描述】:

我们正在使用 TeamCity 进行构建和部署,作为其中的一部分,我们希望 TeamCity 在 package.json 文件中定义版本号。我们过去一直使用gulp-bump,这会增加版本号,但 TeamCity 并未将其内部版本号基于 package.json 文件中的详细信息。

那么有没有一种简单的方法可以让 TC 用特定的版本号更新 package.json?我知道我可以以某种方式将 var 传递给 gulp 并让它以这种方式设置 package.json 版本,但我希望有一种更“自动化”的方式来做到这一点。

【问题讨论】:

    标签: json node.js npm teamcity


    【解决方案1】:

    您可以使用此命令在构建步骤部分package.json 中轻松更改此命令

    npm version "1.0.%build.number%" --allow-same-version
    

    --allow-same-version这是重复版本

    【讨论】:

    • 当我尝试执行此命令时,npm 尝试将更改提交到 git 存储库并失败并出现以下错误:npm ERR!错误:对象目录/TeamCity/buildAgent/work/ae09b07f727ad1af/.git/objects/C:\TeamCity\buildAgent\system\git\git-39B46704.git\objects 不存在;检查 .git/objects/info/alternates npm ERR!致命:无法解析 HEAD
    【解决方案2】:

    在 TeamCity 中,我发现(在尝试了各种技术之后)只需使用 Powershell 对 package.json 进行查找和替换就容易多了。

    添加一个 Powershell 构建步骤:

    $packageFile = "D:\PathToPackageFile\package.json"
    (Get-Content $packageFile).replace('"version": "0.0.0"', '"version": "%build.number%"') 
    | Set-Content $packageFile
    

    【讨论】:

      【解决方案3】:

      我刚刚向 teamcity 添加了一个命令行构建步骤,其中包含以下内容:

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

      这会将你的补丁号调整为团队城市版本号

      【讨论】:

        【解决方案4】:

        这取决于您对自动化的定义。 TeamCity 中没有构建功能来更新使用 Teamcity 9 吞咽/凉亭等的各种 .json 文件。

        和你一样,我正在使用 gulp-bump 设置版本号,但我找到了一种使用 teamcity 版本号在 package.json 文件中设置版本号的方法。

        仅供参考,我正在使用 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 上的内部版本号。

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

        gulp build --version=2.3.4
        

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

        因此,我创建了一个新函数来在需要读取内容时加载文件

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

        在我的 TeamCity 构建中,我有一个使用 Gulp 运行器类型的构建步骤。对于我只有“构建”的命令

        我有以下附加命令行参数

        --version=%build.number%
        

        这对我来说是在 package.json 中设置版本。如果您使用的是 bower 等,则只需将其他 json 文件添加到 config.packages

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-24
          • 2018-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-27
          • 2012-10-15
          • 2021-03-21
          相关资源
          最近更新 更多