问题描述
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];
};
网友评论