美文网首页
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