美文网首页
codepush server 踩坑记

codepush server 踩坑记

作者: 莫帆海氵 | 来源:发表于2020-11-18 23:37 被阅读0次

    问题描述

    codepush sever 在获取是否有更新资源包的时候,会根据版本号匹配判断发布的资源包,只有匹配到当前版本下有新的资源包才更新。有一次遇到问题在多次发布资源包后当前某个版本的 app 下始终匹配不到最新的资源包。

    // 查询发布历史的命令
    code-push deployment history pt-rn-ios production
    

    比如有下面的发布资源包历史记录

    Label Release Time App Version Description
    v5 16 minutes ago * test for *
    v4 20 minutes ago ^2.9.0 test for ^
    v3 25 minutes ago 2.9.* test for .*
    v2 28 minutes ago 2.9 test for short
    v1 30 minutes ago 2.9.0 init

    基于上面的发布记录,在 2.9.0 的 app 下访问希望能获取到 v5 对应的最新更新的资源包,但始终只命中 v1 的,而不是最新的资源包

    问题原因

    codepush server 在获取更新的资源包时候,比较的版本号会有优先级的概念,多种不同策略的版本号更新规则,版本号越精确优先级越高,如果没有精准匹配的才查找模糊的匹配的。

    参照下面的代码,从所有的符合版本号规则的历史中遍历查找所有,找到 max_version - min_version 差值最小的返回。

        // updateCheck 的部分代码
        var version = common.parseVersion(appVersion);
        return models.DeploymentsVersions.findAll({where: {
          deployment_id: dep.id,
          min_version: { [Sequelize.Op.lte]: version },
          max_version: { [Sequelize.Op.gt]: version }
        }})
        .then((deploymentsVersionsMore) => {
          var distance = 0;
          var item = null;
          _.map(deploymentsVersionsMore, function(value, index) {
            if (index == 0) {
              item = value;
              distance = value.max_version - value.min_version;
            } else {
              if (distance > (value.max_version - value.min_version)) {
                distance = value.max_version - value.min_version;
                item = value;
              }
            }
          });
          log.debug(item);
          return item;
        });
    

    附上 codepush server 生成max_version min_version 的方法

    common.validatorVersion = function (versionNo) {
      var flag = false;
      var min = '0';
      var max = '9999999999999999999';
      var data = null;
      if (versionNo == "*") {
        // "*"
        flag = true;
      } else if (data = versionNo.match(/^([0-9]{1,3}).([0-9]{1,5}).([0-9]{1,10})$/)) {
        // "1.2.3"
        flag = true;
        min = data[1] + _.padStart(data[2], 5, '0') + _.padStart(data[3], 10, '0');
        max = data[1] + _.padStart(data[2], 5, '0') + _.padStart((parseInt(data[3])+1), 10, '0');
      } else if (data = versionNo.match(/^([0-9]{1,3}).([0-9]{1,5})(\.\*){0,1}$/)) {
        // "1.2" "1.2.*"
        flag = true;
        min = data[1] + _.padStart(data[2], 5, '0') + _.padStart('0', 10, '0');
        max = data[1] + _.padStart((parseInt(data[2])+1), 5, '0') + _.padStart('0', 10, '0');
      } else if (data = versionNo.match(/^\~([0-9]{1,3}).([0-9]{1,5}).([0-9]{1,10})$/)) {
        //"~1.2.3"
        flag = true;
        min = data[1] + _.padStart(data[2], 5, '0') + _.padStart(data[3], 10, '0');
        max = data[1] + _.padStart((parseInt(data[2])+1), 5, '0') + _.padStart('0', 10, '0');
      } else if (data = versionNo.match(/^\^([0-9]{1,3}).([0-9]{1,5}).([0-9]{1,10})$/)) {
        //"^1.2.3"
        flag = true;
        min = data[1] + _.padStart(data[2], 5, '0') + _.padStart(data[3], 10, '0');
        max = _.toString((parseInt(data[1])+1)) + _.padStart(0, 5, '0') + _.padStart('0', 10, '0');
      } else if (data = versionNo.match(/^([0-9]{1,3}).([0-9]{1,5}).([0-9]{1,10})\s?-\s?([0-9]{1,3}).([0-9]{1,5}).([0-9]{1,10})$/)) {
        // "1.2.3 - 1.2.7"
        flag = true;
        min = data[1] + _.padStart(data[2], 5, '0') + _.padStart(data[3], 10, '0');
        max = data[4] + _.padStart(data[5], 5, '0') + _.padStart((parseInt(data[6])+1), 10, '0');
      } else if (data = versionNo.match(/^>=([0-9]{1,3}).([0-9]{1,5}).([0-9]{1,10})\s?<([0-9]{1,3}).([0-9]{1,5}).([0-9]{1,10})$/)) {
        // ">=1.2.3 <1.2.7"
        flag = true;
        min = data[1] + _.padStart(data[2], 5, '0') + _.padStart(data[3], 10, '0');
        max = data[4] + _.padStart(data[5], 5, '0') + _.padStart(data[6], 10, '0');
      }
      return [flag, min, max];
    };
    

    相关文章

      网友评论

          本文标题:codepush server 踩坑记

          本文链接:https://www.haomeiwen.com/subject/furfiktx.html