本发明涉及软件维护与演化,特别涉及一种基于行为一致性的库版本约束扩展方法。
背景技术:
1、随着软件生态系统的发展,软件项目越来越常依赖第三方库来实现代码重用。为了方便用户构建项目,开发者通常在配置文件中明确指定所依赖的第三方库的版本限制,以确保可复现的环境中的第三方库版本符合预期。然而,软件项目和它们所依赖的第三方库是独立开发的,这意味着开发者必须在没有明确指导的情况下手动编写版本限制。此外,第三方库的快速更新要求开发者花费额外的精力来保持这些限制随着库的更新而更新。考虑到软件项目通常在配置文件中包含对多个库的直接依赖,同时又可以由直接依赖的依赖引入间接依赖,当出现对于同一个库的版本约束出现冲突时,就会出现依赖冲突问题。相关项目可能因为缺乏兼容的执行环境而导致构建失败。
2、为了应对上述问题,已有的方法或是通过构建依赖图等方式更快地检测并报告依赖冲突问题,或是通过改变安装策略的方法尽可能避免出现依赖冲突问题,但这些方法都是基于原有的版本约束,而非考虑改写版本约束本身。对于依赖冲突问题的解决,python官方文档的建议之一就是去使用更宽松的版本约束,但这对普通开发者而言并不容易,因为难以直接判断在采用未知版本后是否可保持行为一致性。因此,一种基于行为一致性的自动库版本扩展方法亟待提出。
技术实现思路
1、本发明为尽可能扩展python项目对第三方库的版本约束以解决或预防依赖冲突问题,同时为保证扩展后的版本约束仍能保持行为一致性,提出一种基于行为一致性的库版本约束扩展方法;采用保守的静态分析的方式,自动地分析项目与库的源码,并考虑了调用关系与上层库,在此基础上向项目开发者推荐更合理的、适用性更强的版本约束。
2、为实现上述目的,本发明采用以下技术方案:
3、一种基于行为一致性的库版本约束扩展方法,包括以下步骤:
4、采用静态分析方式分析项目源码以及该项目中使用到的库源码,然后根据两者的源码确定在该项目中被直接使用到的库功能以及间接调用的库功能;
5、针对项目中使用的库,对比其当前使用的基准版本与任一未知版本的版本差异;若存在差异且未知版本的库功能与项目中所有直接或间接调用的库功能均没有重叠,则将该未知版本的库合并入对应的基准版本库中,以实现保持行为一致性的库版本约束扩展。
6、为优化上述技术方案,采取的具体措施还包括:
7、进一步地,所述确定项目中被直接使用到的库功能具体方案为:
8、第一阶段:分析项目源码,获取该项目对库中的直接功能调用,构成候选api的集合;
9、第二阶段:对于每个候选api,如果能在给定的基准版本库中找到对应的完全限定名,则该api为实际入口api,即实际入口api视为直接使用到的库功能。
10、进一步地,在所述第一阶段中,分析项目源码时需同步考虑项目源码与外部模块和元素的引入方式,以确保不会遗漏该项目对库中功能的调用。
11、进一步地,所述确定项目中间接调用的库功能具体方案为:
12、根据给定的基准版本库,通过追踪其内部的函数调用关系,构建以实际入口api为入口的按需调用图;
13、按此方式生成的调用图中,除作为实际入口api的节点外,调用图中的其它节点即认定为在该项目中所有间接调用到的库功能部分。
14、进一步地,所述构建按需调用图的具体方案如下:
15、s1:生成基准版本库中所有模块的抽象语法树;
16、s2:对所有在该库中的定义类和函数创建初始节点,并对每个初始节点通过一个完全限定名来进行唯一标识;
17、s3:基于步骤s2中的初始节点,创建待分析节点集合a和已分析节点集合b,并初始化为实际入口api的完全限定名对应的节点;
18、s4:若集合a为空集,则跳转到步骤s6;否则取集合a中的任一节点x至步骤s5中;
19、s5:对节点x,识别其调用关系c,并通过尝试分析其合法范围内的变量将这些调用关系匹配到其他节点y上,若成功匹配则在调用图中加入节点x指向节点y的边;在分析完节点x的所有调用关系后,将节点x从集合a中删除并加入集合b中,然后跳转到步骤s4中;其中,若节点x的调用关系c是指向上层库的调用,则将上层库中相应元素创建节点并加入到调用图中;此外,如果其它节点y不在集合a或集合b中,则将节点y加入集合a;
20、s6:基于上述步骤完成按需调用图的构建。
21、进一步地,在步骤s5中,对于一些无法被任何实际入口api以任何方式所调用到的库功能部分,仅做基础的语法分析,而不深入分析其内部的其他调用关系。
22、进一步地,所述针对项目中使用的库,对比其当前使用的基准版本与任一未知版本的版本差异具体方案为:通过比较库的未知版本和基准版本间的源码区别、配置文件区别、各自对上层库依赖的区别来判断两个版本间是否存在差异。
23、进一步地,所述给定库的基准版本是需符合项目对该库的版本约束的任意版本;而对库的未知版本则无限定要求。
24、本发明的有益效果是:本发明提供一种基于行为一致性的库版本约束扩展方法,通过分析项目和库的源码及配置文件,实现项目对库的版本约束的自动扩展,从而有效解决由于项目对库的约束过于严格而导致的依赖冲突问题;同时只生成必要部分的调用图,大大提高了生成调用图步骤的效率。
1.一种基于行为一致性的库版本约束扩展方法,其特征在于,包括以下步骤:
2.根据权利要求1所述的一种基于行为一致性的库版本约束扩展方法,其特征在于,所述确定项目中被直接使用到的库功能具体方案为:
3.根据权利要求2所述的一种基于行为一致性的库版本约束扩展方法,其特征在于,在所述第一阶段中,分析项目源码时需同步考虑项目源码与外部模块和元素的引入方式,以确保不会遗漏该项目对库中功能的调用。
4.根据权利要求2所述的一种基于行为一致性的库版本约束扩展方法,其特征在于,所述确定项目中间接调用的库功能具体方案为:
5.根据权利要求4所述的一种基于行为一致性的库版本约束扩展方法,其特征在于,所述构建按需调用图的具体方案如下:
6.根据权利要求5所述的一种基于行为一致性的库版本约束扩展方法,其特征在于,在步骤s5中,对于一些无法被任何实际入口api以任何方式所调用到的库功能部分,仅做基础的语法分析,而不深入分析其内部的其他调用关系。
7.根据权利要求1所述的一种基于行为一致性的库版本约束扩展方法,其特征在于,所述针对项目中使用的库,对比其当前使用的基准版本与任一未知版本的版本差异具体方案为:通过比较库的未知版本和基准版本间的源码区别、配置文件区别、各自对上层库依赖的区别来判断两个版本间是否存在差异。
8.根据权利要求1所述的一种基于行为一致性的库版本约束扩展方法,其特征在于,