【问题标题】:How to Increment Version Number via Gulp Task?如何通过 Gulp 任务增加版本号?
【发布时间】:2016-07-20 06:40:47
【问题描述】:

我想用另一个字符串替换 javascript 文件 (myConstantsFile.js) 中指示版本号的字符串。因此,例如,我的版本号如下所示:“01.11.15”,在myConstantsFile.js 中这样写,其他常量:

.constant('productVersion', '1.11.15'); 

现在,我的任务是这样的:

gulp.task('increment-version', function(){
    gulp.src(['./somedir/myConstantsFile.js'])
        .pipe(replace(/'productVersion', '(.*)'/g, '99.99.99'))
        .pipe(gulp.dest('./somedir/'));
});

如您所见,我使用的是常量,而不是运行 incrementation code,它看起来像这样:

    var numberString = '0.0.1';
    var versionParts = numberString.split('.');
    var vArray = {
      vMajor : versionParts[0],
      vMinor : versionParts[1],
      vPatch : versionParts[2]
    } 

    vArray.vPatch = parseFloat(vArray.vPatch) + 1;
    var periodString = ".";

    var newVersionNumberString = vArray.vMajor + periodString + 
                                vArray.vMinor+ periodString + 
                                vArray.vPatch; 

我需要:

  1. 一种通过文件通过正则表达式选择当前版本号的方法。
  2. 要知道我可以将逻辑放在最后一个代码块中的什么位置,以增加数字并构建新字符串。

【问题讨论】:

  • gulp-bump 怎么样? npmjs.com/package/gulp-bump
  • 根据过去的经验,将您的内部版本号保存在自己的文件中(在这种情况下,甚至可能是 JSON)。当代码文件中的 sed 替换最终导致问题时,几乎不可能弄清楚。
  • @cl3m 看起来不错,我正在查看功能。我的主要问题是通过正则表达式对数据进行基本选择以使用以及放置我的变量/函数的位置。这是我第一次用 gulp 做任何事情,除了运行 browser-sync 等等。 ssube - 这是个好主意,但问题是需要从中提取角度常数。
  • 我们用 grunt 做了一个非常相似的事情。版本存储在 package.json 中,并在 grunt 任务文件中递增。 不确定这如何转化为 Gulp。 我会说这已被证明有些脆弱,因为多个开发人员都可以在构建上执行增量,并且因为 package.json(在我们的例子中)不受版本控制,它很容易不同步。所以 - 要点是:版本控制你的内部版本号来源。
  • @Bosworth99 注意。整个过程很痛苦,我们在构建期间也在 SQL 中增加版本号,但不是通过 gulp,然后检查版本是否对齐,以查看更新后用户是否刷新了浏览器(以防 API 调用发生更改或其他情况)。我还没有看到一个合适的方法来做到这一点,但这完全是一个不同的问题。

标签: javascript angularjs gulp build-process


【解决方案1】:

安装gulp-bump

npm install gulp-bump --save-dev

安装yargs

npm install yargs --save-dev

需要 gulp-bump

var bump = require('gulp-bump');

需要 yargs

var args = require('yargs').argv;

你的碰撞任务

gulp.task('bump', function () {
    /// <summary>
    /// It bumps revisions
    /// Usage:
    /// 1. gulp bump : bumps the package.json and bower.json to the next minor revision.
    ///   i.e. from 0.1.1 to 0.1.2
    /// 2. gulp bump --version 1.1.1 : bumps/sets the package.json and bower.json to the 
    ///    specified revision.
    /// 3. gulp bump --type major       : bumps 1.0.0 
    ///    gulp bump --type minor       : bumps 0.1.0
    ///    gulp bump --type patch       : bumps 0.0.2
    ///    gulp bump --type prerelease  : bumps 0.0.1-2
    /// </summary>

    var type = args.type;
    var version = args.version;
    var options = {};
    if (version) {
        options.version = version;
        msg += ' to ' + version;
    } else {
        options.type = type;
        msg += ' for a ' + type;
    }


    return gulp
        .src(['Path to your package.json', 'path to your bower.json'])
        .pipe(bump(options))
        .pipe(gulp.dest('path to your root directory'));
});

VSO 注意:我相信很多来到这个帖子的人都会在寻找上面的答案。下面的代码是编辑存储在 npm/bower 包文件之外的某个地方的版本号,例如在角度常量中:

gulp.task('increment-version', function(){
    //docString is the file from which you will get your constant string
    var docString = fs.readFileSync('./someFolder/constants.js', 'utf8');

    //The code below gets your semantic v# from docString
    var versionNumPattern=/'someTextPreceedingVNumber', '(.*)'/; //This is just a regEx with a capture group for version number
    var vNumRexEx = new RegExp(versionNumPattern);
    var oldVersionNumber = (vNumRexEx.exec(docString))[1]; //This gets the captured group

    //...Split the version number string into elements so you can bump the one you want
    var versionParts = oldVersionNumber.split('.');
    var vArray = {
        vMajor : versionParts[0],
        vMinor : versionParts[1],
        vPatch : versionParts[2]
    };

    vArray.vPatch = parseFloat(vArray.vPatch) + 1;
    var periodString = ".";

    var newVersionNumber = vArray.vMajor + periodString +
                           vArray.vMinor+ periodString +
                           vArray.vPatch;

    gulp.src(['./someFolder/constants.js'])
        .pipe(replace(/'someTextPreceedingVNumber', '(.*)'/g, newVersionNumber))
        .pipe(gulp.dest('./someFolder/'));
});

我省略了一些将我的常量写成漂亮字符串的笨拙的东西,但这就是要点并且它有效。

【讨论】:

  • 我很感谢您的回复,赞成,并且可能最终会接受并提出另一个问题,但我不想修改 package.json,我想更改不同文件中的字符串。也许我误解了 gulp 的局限性。
  • Gulp 非常棒。期待什么。你可能想看看这个:stackoverflow.com/a/36335869/4775223
  • 谢谢 - 有没有一些简单的方法可以将我的正则表达式的结果 - /'productVersion', '(.*)'/g 放入一个 var 然后处理它?还是最终成为一个插件?
  • 这是一个想法。由于您的 package.json 是您的,也许您可​​以让 gulp-replace 使用 package.json 版本在其他地方更新您的字符串,并且仍然使用凹凸来控制您的版本。是不是那个圆。这意味着向凹凸任务添加管道。
  • 好点。随意编辑并为帖子添加价值。我期待看到你最终的结果。
【解决方案2】:

从过去 5 小时开始研究 gulp,因为我有一项任务来解决这个要求。所以,作为一个绝对的菜鸟,我得出了下面的代码,它没有正则表达式。感谢 @VSO@Wilmer Saint 的快速入门。可能是一个微小的变化,但这对我有帮助。

gulp.task('version', function(){
  var fs = require('fs');
    //docString is the file from which you will get your constant string
    var docString = fs.readFileSync('app/scripts/version/version.js', 'utf8'); //type of docString i an object here.

    var versionParts = docString.split('.');

    var vArray = {
        vMajor : versionParts[0],
        vMinor : versionParts[1],
        vPatch : versionParts[2]
    };

    vArray.vPatch = parseFloat(vArray.vPatch) + 1;
    var periodString = ".";
    var newVersionNumber = vArray.vMajor + periodString +
                           vArray.vMinor+ periodString +
                           vArray.vPatch;



    require('fs').writeFileSync('app/scripts/version/version.js', newVersionNumber + "'");
        return gulp.src(['app/scripts/version/version.js'])
            .pipe(gulp.dest('app/scripts/version/new_version'));//creates version.js file in the directory
    });

或者返回码可以如下覆盖version.js文件中的数字

return gulp.src(['app/scripts/version/version.js'],
                {base: './app/scripts/version/version.js'})
        .pipe((gulp.dest('./app/scripts/version/version.js'))) 

我的 version.js 只有以下代码

versionBuild = '1.0.8'

我在我的主要功能中使用了以下内容(加载应用程序时加载)

var versionBuild=parseInt(1000*Math.random());
var random = function(digs){
    var rndn;
    if(window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1") {
        rndn = Math.random();
        if(digs != undefined && !isNaN(digs)){
              rndn =  parseInt(Math.pow(10, digs)*rndn)
              }
              return rndn;
    }
    else {
        return versionBuild;
    }
}

【讨论】:

    【解决方案3】:

    你可以使用 gulp-bump,它非常简单和甜蜜 :)

    npm install --save gulp-bump
    
    const bump = require('gulp-bump');
    
    gulp.task('bump', async () => {
        gulp.src('./package.json')
        .pipe(bump({key: "version"}))
        .pipe(gulp.dest('./'));
      });
    

    注意:在函数前使用async。这是一个要求。

    【讨论】:

      【解决方案4】:
      gulp.task('bump', function() {
          var vers = JSON.parse(fs.readFileSync(__dirname + '/package.json')).version.split('.');
          var second = parseInt(vers[1]);
          var third  = parseInt(vers[2]);
          var options = { key: 'version' };
      
          if(third == 9 && second != 9) {
              third = 0;
              options.type = 'minor';
          } else if (second == 9 && third == 9) {
              second = 0;
              options.type = 'major';
          }
      
          gulp.src(__dirname + '/package.json')
          .pipe(bump(options))
          .pipe(gulp.dest('./'));
      });
      

      【讨论】:

      • 我觉得没必要
      猜你喜欢
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 2014-02-21
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多