代码编译检测方法、装置、电子设备及存储介质与流程

未命名 07-23 阅读:101 评论:0


1.本技术涉及计算机技术领域,尤其涉及一种代码编译检测方法、装置、电子设备及存储介质。


背景技术:

2.在app发版过程中,如果发版节奏快,版本代码集成时间就相应变短,版本集成效率成为制约发版效率的重要因素。
3.图1示意的是在一个app研发周期内各阶段与代码分支的对应关系。需求阶段、研发阶段、测试阶段都是在需求分支上进行的,需求分支测试完成之后,在需求集成阶段会将符合条件的需求分支代码集成到版本分支中去。在一个app版本周期内,需求分支会有很多个,版本分支只有1个。在app版本研发流程的需求集成阶段,会有1个截止时间,这个截止时间之后,各个业务测试人员会拿版本分支二进制包进行集成回归测试。
4.在代码集成过程中,由于各个需求分支代码在很多情况下与版本分支代码环境不一致,导致需求分支代码merge(合并)到版本分支过程中,容易出现代码冲突,造成集成分支代码编译不通过,影响代码集成的正常节奏,app不能按照预定时间发版。
5.为了规避由于某个业务/开发者集成代码导致app代码编译不通过影响其它业务/开发者的问题,可以对所有待集成分支代码进行串行排队处理,同时引入编译检测功能,通过编译检测的代码集成任务才允许集成,具体流程可参见图2所示。
6.使用队列的方式来锁定任务执行,可以从根本上保证待集成代码编译的正确性,但是并行任务变串行,大大加长了代码集成时长。由于代码集成后需要生成最新app进行测试,代码集成时间越长,越浪费测试资源。所以代码集成过程中编译检测效率,成为影响代码集成效率的关键因素。
7.现有的编译检测方案主要包括以下两种:一、针对待集成代码,不考虑代码改动涉及的范围,对app下的所有工程代码进行一次全量源代码编译,如果最终编译通过,则验证了待集成代码不会在集成后造成app编译不通过。二、基于分布式编译的思想,针对不同机型进行分布式编译。
8.针对现有方案一而言,全源代码编译,虽然可以保证正确性,但是对于代码文件较多的场景,编译一次耗时很长;针对现有方案二而言,每种机型上的编译代码都是全量的,虽然可以提高不同机型上编译检测效率,但是不能从根本上提高待集成代码的编译检测效率。


技术实现要素:

9.鉴于上述问题,本技术实施例提供一种克服上述问题或者至少部分地解决上述问题的代码编译检测方法、装置、电子设备及存储介质。
10.第一方面,本技术实施例提供了一种代码编译检测方法,包括:
11.确定待集成代码集合所匹配的第一组件集合;
12.基于组件依赖关系和所述第一组件集合确定第二组件集合,并对所述第二组件集合对应的源码文件进行编译,生成所述第二组件集合对应的最新静态库,所述第二组件集合包括所述第一组件集合中的第一组件以及直接依赖所述第一组件的第二组件;
13.基于所述组件依赖关系确定目标组件集合,所述目标组件集合包括所述第二组件集合中的组件以及与所述第二组件集合中的组件形成关联关系的第三组件,所述第三组件归属于第三组件集合;
14.将所述第二组件集合对应的最新静态库和所述第三组件集合对应的静态库进行链接。
15.第二方面,本技术实施例提供了一种代码编译检测装置,包括:
16.第一确定模块,用于确定待集成代码集合所匹配的第一组件集合;
17.第一处理模块,用于基于组件依赖关系和所述第一组件集合确定第二组件集合,并对所述第二组件集合对应的源码文件进行编译,生成所述第二组件集合对应的最新静态库,所述第二组件集合包括所述第一组件集合中的第一组件以及直接依赖所述第一组件的第二组件;
18.第二确定模块,用于基于所述组件依赖关系确定目标组件集合,所述目标组件集合包括所述第二组件集合中的组件以及与所述第二组件集合中的组件形成关联关系的第三组件,所述第三组件归属于第三组件集合;
19.第二处理模块,用于将所述第二组件集合对应的最新静态库和所述第三组件集合对应的静态库进行链接。
20.第三方面,本技术实施例提供了一种电子设备,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如上述第一方面所述的代码编译检测方法的步骤。
21.第四方面,本技术实施例提供了一种计算机可读存储介质,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如上述第一方面所述的代码编译检测方法的步骤。
22.本技术实施例技术方案,在确定待集成代码集合所匹配的第一组件集合后,基于组件依赖关系确定包括第一组件集合中的第一组件以及直接依赖第一组件的第二组件的第二组件集合,对第二组件集合对应的源码文件进行编译,生成第二组件集合对应的最新静态库,并基于组件依赖关系确定目标组件集合,将第二组件集合对应的最新静态库和目标组件集合中第三组件集合对应的静态库进行链接,可以实现基于组件依赖关系,精准判定出与待集成代码集合相关联的组件并进行源代码编译,充分利用已经编译好的静态库,将与待集成代码集合不相关联的组件直接使用静态库参与编译,可有效控制代码编译范围,将参与源代码编译的组件数控制至最低,最大程度利用已经编译成静态库的组件,从而降低总体编译时间,提高代码集成效率,同时保证了待集成代码编译效率和编译正确性的平衡。
附图说明
23.图1表示app研发周期内各阶段与代码分支的对应关系的示意图;
24.图2表示对代码集成任务进行编译检测的示意图;
25.图3表示本技术实施例提供的代码编译检测方法的示意图;
26.图4表示本技术实施例提供的基于组件的多app研发架构中组件依赖关系的示意图;
27.图5表示本技术实施例提供的组件之间关联关系的一具体示意图;
28.图6表示本技术实施例提供的代码编译检测方法的一整体实施流程图;
29.图7表示本技术实施例提供的代码编译检测装置的示意图;
30.图8表示本技术实施例提供的电子设备结构示意图。
具体实施方式
31.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
32.应理解,说明书通篇中提到的“一个实施例”或“一实施例”意味着与实施例有关的特定特征、结构或特性包括在本技术的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”未必一定指相同的实施例。此外,这些特定的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。本技术实施例中的多个可以包括两个以及两个以上。
33.在本技术的各种实施例中,应理解,下述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本技术实施例的实施过程构成任何限定。
34.本技术实施例提供一种代码编译检测方法,参见图3所示,该方法包括:
35.步骤301、确定待集成代码集合所匹配的第一组件集合。
36.本技术实施例提供的代码编译检测方法,首先确定目标应用对应的待集成代码集合,目标应用为需要发版的应用,且目标应用对应的待集成代码集合包括目标应用对应的待集成的组件代码文件。
37.在确定包括待集成的组件代码文件的待集成代码集合之后,确定待集成代码集合所匹配的第一组件集合,第一组件集合包括与待集成代码集合中的组件代码文件直接匹配的第一组件,即,第一组件集合中的第一组件为待集成代码集合所直接涉及到的组件。
38.步骤302、基于组件依赖关系和所述第一组件集合确定第二组件集合,并对所述第二组件集合对应的源码文件进行编译,生成所述第二组件集合对应的最新静态库,所述第二组件集合包括所述第一组件集合中的第一组件以及直接依赖所述第一组件的第二组件。
39.在确定待集成代码集合所直接涉及到的第一组件集合之后,基于预先建立的组件依赖关系,确定包括第一组件集合中的第一组件以及直接依赖第一组件的第二组件的第二组件集合;然后对第二组件集合对应的源码文件进行编译,以获取第二组件集合对应的最新静态库。
40.下面通过一具体示例对组件之间的依赖关系进行介绍,基于组件的多app研发架构中的组件对应的是一个工程代码库,在ios领域表现为一个cocoapods代码库,这个工程代码库拥有唯一的git地址,可供开发者上传和下载代码。参见图4所示,在基于组件的多
app研发架构中,根据依赖程度分为业务层组件、中间件层组件、基础库层组件,业务层组件在最上层,不被任何组件依赖,上层组件可以依赖下层组件、下层组件不可以依赖上层组件,可以隔层依赖,业务层组件之间不可以相互依赖,中间件层组件、基础库层组件可以在同一层级单向依赖。
41.在确定第一组件集合之后,可以根据组件依赖关系,针对第一组件集合中的每个第一组件,查找直接依赖第一组件的第二组件,然后将各第一组件和各第一组件分别对应的第二组件进行聚合,确定第二组件集合。
42.针对任意一组件而言,其可以包括一个或者多个代码文件;对第二组件集合对应的源码文件进行编译,实际为对第二组件集合中各组件对应的源码文件进行编译,以通过源码编译获取组件对应的最新静态库。
43.步骤303、基于所述组件依赖关系确定目标组件集合,所述目标组件集合包括所述第二组件集合中的组件以及与所述第二组件集合中的组件形成关联关系的第三组件,所述第三组件归属于第三组件集合。
44.基于组件依赖关系还可以确定包括第二组件集合中的组件以及与第二组件集合中的组件形成关联关系的第三组件的目标组件集合,其中,与第二组件集合中的组件形成关联关系的第三组件,可以包括依赖第二组件集合中的组件的组件以及被第二组件集合中的组件所依赖的组件,即,这里的关联关系可以包括依赖关系以及被依赖关系,且依赖关系可以包括直接依赖和间接依赖,相应地,被依赖关系可以包括直接被依赖和间接被依赖。
45.例如,针对第二组件集合中的一组件,可以基于组件依赖关系,查找直接和间接依赖该组件的组件,以及,查找直接和间接被该组件依赖的组件,以获取该组件对应的第三组件。
46.其中,目标组件集合可以看作第二组件集合和第三组件集合的聚合,第三组件集合包括第三组件;第二组件集合包括待集成代码集合所直接涉及的第一组件以及直接依赖所涉及的第一组件的第二组件;第三组件集合中的第三组件与第二组件集合中的组件相区别,且与第二组件集合中的组件具有关联关系。第三组件与第二组件集合中的组件之间的关联关系可以包括:第三组件依赖第二组件集合中的组件以及第二组件集合中的组件依赖第三组件,即,第三组件可以依赖第二组件集合中的组件,也可以是第二组件集合中的组件依赖第三组件。
47.步骤304、将所述第二组件集合对应的最新静态库和所述第三组件集合对应的静态库进行链接。
48.在生成第二组件集合对应的最新静态库、确定包括第二组件集合和第三组件集合的目标组件集合之后,可以获取第三组件集合对应的静态库,然后将第二组件集合对应的最新静态库和第三组件集合对应的静态库进行链接,以完成编译检测过程。
49.需要说明的是,程序代码编译经过预处理、编译、汇编、链接四个过程,在移动app领域,预处理、编译、汇编可以生成编译中间体,即静态库,所以,一次编译时间=源代码编译时间(预处理+编译+汇编+链接4阶段时间)=将源代码编译成静态库时间(预处理+编译+汇编3个阶段时间)+链接时间。因此,在将第二组件集合对应的最新静态库和第三组件集合对应的静态库进行链接后,可完成编译检测过程。
50.第三组件集合对应的静态库为未重新进行源码编译的静态库,由于第三组件集合
中的第三组件不属于待集成代码集合所直接涉及的组件,也不属于直接依赖第一组件(待集成代码集合所直接涉及的组件)的组件,所以属于不受影响的组件,因此可以不对其重新进行源码编译,直接利用已有静态库即可。
51.本技术上述实施方案,在确定待集成代码集合所匹配的第一组件集合后,基于组件依赖关系确定包括第一组件集合中的第一组件以及直接依赖第一组件的第二组件的第二组件集合,对第二组件集合对应的源码文件进行编译,生成第二组件集合对应的最新静态库,并基于组件依赖关系确定目标组件集合,将第二组件集合对应的最新静态库和目标组件集合中第三组件集合对应的静态库进行链接,可以实现基于组件依赖关系,精准判定出与待集成代码集合相关联的组件并进行源代码编译,充分利用已经编译好的静态库,将与待集成代码集合不相关联的组件直接使用静态库参与编译,可有效控制代码编译范围,将参与源代码编译的组件数控制至最低,最大程度利用已经编译成静态库的组件,从而降低总体编译时间,提高代码集成效率,同时保证了待集成代码编译效率和编译正确性的平衡。
52.下面对确定第一组件集合的过程进行介绍,所述确定待集成代码集合所匹配的第一组件集合,包括:
53.针对所述待集成代码集合中的每个代码文件,获取所述代码文件对应的组件标识;
54.将所述待集成代码集合中各代码文件对应的组件标识进行聚合,生成所述第一组件集合。
55.待集成代码集合所直接涉及的组件可以为一个或者多个,需要针对待集成代码集合,确定本次代码集成所直接涉及的全部组件,进而生成待集成代码集合所匹配的第一组件集合。
56.其中,待集成代码集合可以包括一个或者多个待提交的代码文件,针对每个代码文件,遍历当前代码文件所属远程组件库信息、获取当前代码文件对应的组件标识,这里的组件标识与基于组件的多app研发架构中的组件具备一一映射关系,在获取当前代码文件对应的组件标识之后,将组件标识存储于集合s-min中。通过获取待集成代码集合中的每个代码文件对应的组件标识、并存储于集合s-min中,可以将待集成代码集合中各代码文件对应的组件标识进行聚合,通过组件标识的聚合生成第一组件集合,以获取待集成代码集合所直接涉及的组件。
57.上述实施过程,通过针对待集成代码集合中的每个待提交的代码文件,确定代码文件对应的组件标识,将各代码文件对应的组件标识进行聚合,生成第一组件集合,可以实现获取待集成代码集合所直接涉及的全部组件。
58.下面对基于组件依赖关系确定第二组件集合的过程进行介绍,所述基于组件依赖关系和所述第一组件集合确定第二组件集合,包括:
59.基于表征组件依赖关系的有向无环图,针对所述第一组件集合中的每个第一组件,查找直接依赖所述第一组件的第二组件;
60.将所述第一组件集合中的第一组件、每个所述第一组件对应的第二组件进行聚合,确定所述第二组件集合。
61.在针对待集成代码集合,确定其匹配的、包括所直接涉及的第一组件的第一组件
集合之后,基于表征组件依赖关系的有向无环图,针对第一组件集合中的每个第一组件,查找直接依赖第一组件的第二组件,获取每个第一组件所对应的第二组件。其中,针对任意一第一组件而言,其对应的第二组件可以为一个或者多个。
62.在获取第一组件集合中的每个第一组件对应的第二组件之后,将第一组件集合中的第一组件、每个第一组件对应的第二组件进行聚合,生成第二组件集合。即,第二组件集合在包括第一组件集合的基础上,还包括直接依赖第一组件集合中的第一组件的第二组件。
63.由于第二组件为基于有向无环图所确定的直接依赖第一组件的组件,则第二组件可以认为是待集成代码集合所间接涉及的组件,通过将第一组件和第二组件进行聚合确定第二组件集合,可以实现获取待集成代码集合直接涉及的组件以及间接涉及的组件。
64.下面对基于有向无环图查找第二组件、生成第二组件集合的详细实施过程进行介绍。
65.在第一组件集合(s-min)中获取某个元素组件,基于有向无环图判断当前元素组件在有向无环图中的入度是否为0。其中,有向无环图中不被任何组件依赖的组件,其入度为0。
66.若当前元素组件在有向无环图中的入度为0,则表示当前元素组件不被任何组件所依赖,当前组件可以为业务层组件,此时可以直接将当前元素组件存入集合s-direct中。若当前元素组件在有向无环图中的入度不为0,则表示当前元素组件为中间件层组件或基础库层组件,此时需要遍历有向无环图,查找当前元素组件在有向无环图中的所有父级节点,即,查找直接依赖当前元素组件的组件,将查找的父级节点以及当前元素组件存入s-direct中。通过针对第一组件集合中的每个元素组件执行上述流程,可以进行第二组件的查找,以通过组件查找、聚合,确定包括第一组件和第二组件的第二组件集合。
67.下面通过一举例对确定代码改动所涉及的组件的过程进行介绍,参见图5所示,如果房产组件为第一组件,由于房产组件没有其他组件直接依赖它,所以只需房产组件参与源代码编译即可;如果列表组件为第一组件,由于直接依赖列表组件的组件包括:招聘组件、房产组件、黄页组件,那列表组件里面的代码改动,需要列表组件、招聘组件、房产组件、黄页组件参与源代码编译,其他关联组件利用静态库参与编译即可。需要说明的是,图5仅仅作为一举例示意了部分组件之间的依赖关系,属于同一层级的组件也可以产生依赖关系,图5中未做具体示意。
68.上述实施方案,通过基于有向无环图查找直接依赖第一组件的第二组件,可以实现确定待集成代码集合所间接涉及的组件;通过将第一组件集合中的第一组件、第一组件对应的第二组件进行聚合确定第二组件集合,可以实现获取待集成代码集合直接涉及以及间接涉及的组件。
69.下面对生成第二组件集合对应的最新静态库的过程进行介绍,所述对所述第二组件集合对应的源码文件进行编译,生成所述第二组件集合对应的最新静态库,包括:
70.针对所述第二组件集合中的每个组件,对所述组件对应的源码文件进行编译,生成所述组件对应的最新静态库;
71.将所述第二组件集合中各组件对应的最新静态库进行聚合,生成所述第二组件集合对应的最新静态库;
72.其中,所述第二组件集合对应的最新静态库存储于编译服务器。
73.在确定包括第一组件和第二组件的第二组件集合之后,针对第二组件集合中的每个组件,对组件所对应的源码文件进行编译,生成组件对应的最新静态库,以通过源码编译获取组件的最新静态库。
74.在获取第二组件集合中的各组件分别对应的最新静态库之后,将各组件对应的最新静态库进行聚合,确定第二组件集合对应的最新静态库。其中,在生成第二组件集合对应的最新静态库之后,可以将第二组件集合对应的最新静态库存储于编译服务器,以供后续使用。
75.上述实施过程,可以基于组件依赖关系,精准判定出与待集成代码集合相关联的组件并进行源代码编译,可有效控制代码编译范围,将参与源代码编译的组件数控制至最低。
76.下面对确定目标组件集合的过程进行介绍,所述基于所述组件依赖关系确定目标组件集合,包括:
77.基于表征组件依赖关系的有向无环图,确定与所述第一组件集合中的第一组件形成关联关系的第一目标组件,并基于所述第一目标组件生成第一集合,所述第一目标组件为所述有向无环图中不被其他组件依赖的组件;
78.针对所述第一集合中的每个第一目标组件,基于所述有向无环图,查找与所述第一目标组件形成关联关系的第二目标组件;
79.根据所述第一集合中第一目标组件、每个所述第一目标组件关联的第二目标组件,确定所述目标组件集合;
80.其中,直接依赖所述第一组件的所述第一目标组件和所述第二目标组件位于所述第二组件集合,属于所述第一组件的所述第一目标组件和所述第二目标组件位于所述第二组件集合。
81.本实施例中,可以基于组件依赖关系确定目标组件集合,目标组件集合包括第二组件集合以及与第二组件集合中的组件形成关联关系的第三组件,第二组件集合包括待集成代码集合直接涉及、间接涉及的组件,第三组件依赖第二组件集合中的组件或者第二组件集合中的组件依赖第三组件;因此,第三组件不属于待集成代码集合所涉及的组件,无需对存储第三组件的第三组件集合重新进行源码编译。
82.在基于组件依赖关系确定目标组件集合时,可以首先基于表征组件依赖关系的有向无环图,确定与第一组件集合中的第一组件形成关联关系的第一目标组件,第一目标组件为有向无环图中不被其他组件依赖的、在有向无环图中的入度为0,第一目标组件可以为业务层组件。即,第一目标组件可以为直接依赖第一组件或者间接依赖第一组件的业务层组件。针对第一组件集合中的每个第一组件,在确定与第一组件形成关联关系的第一目标组件之后,将各第一组件对应的第一目标组件进行聚合,生成第一集合。这里所说的与第一组件形成关联关系的第一目标组件,可以包括直接依赖第一组件的业务层组件以及间接依赖第一组件的业务层组件。
83.在确定包括第一目标组件的第一集合之后,针对第一集合中的每个第一目标组件,基于有向无环图,查找与第一目标组件形成关联关系的第二目标组件,且在查找时,需要查找与第一目标组件形成直接关联关系的组件、查找与第一目标组件形成间接关联关系
的组件,将查找到的组件确定为第一目标组件关联的第二目标组件。由于第一目标组件可以为业务层组件,与第一目标组件形成直接关联关系的组件,为第一目标组件所直接依赖的组件;与第一目标组件形成间接关联关系的组件,为第一目标组件所间接依赖的组件。
84.在确定第一集合中的各第一目标组件分别关联的第二目标组件之后,可以将第一集合中的第一目标组件、各第一目标组件分别关联的第二目标组件进行聚合,生成目标组件集合。
85.需要说明的是,目标组件集合中包括第一目标组件以及第二目标组件,从另一角度来说,目标组件集合包括第二组件集合和第三组件集合,由于第二组件集合包括第一组件和第二组件,目标组件集合中直接依赖第一组件的第一目标组件和第二目标组件位于第二组件集合、属于第一组件的第一目标组件和第二目标组件位于第二组件集合;即,目标组件集合中直接依赖第一组件的第一目标组件和第二目标组件属于第二组件。相应地,目标组件集合中与第二组件集合中的组件相区别的组件为第三组件。
86.下面通过一具体示例对基于第一组件集合(s-min)确定目标组件集合的过程进行介绍。
87.在第一组件集合(s-min)中获取某个元素组件,从当前元素组件回溯遍历有向无环图,将与当前元素组件关联的入度为0的节点存入第一集合(s-temp)。以图5中的微聊组件为例,回溯遍历会将招聘组件、房产组件、黄页组件存入s-temp,虽然生命周期组件、列表组件也依赖微聊组件,但入度不为0,因此不需要加入s-temp。重复执行从s-min中获取元素组件、遍历有向无环图、向s-temp中存储节点的步骤,直至s-min中的每个元素均被访问到。
88.从s-temp中获取某个元素组件,遍历有向无环图,直至所有子节点出度为0(没有可依赖的组件),将遍历过程中的所有节点存入s-all(目标组件集合)。以图5中的房产组件为例,会从房产组件出发遍历,将其所有节点查找出存入s-all。重复从s-temp中获取元素组件、遍历有向无环图、向s-all存入节点的步骤,直至s-temp中的每个元素均被访问到。
89.上述实施方案,可以基于组件依赖关系,确定与第一组件关联的不被其他组件依赖的组件、生成第一集合,并基于组件依赖关系,查找关联组件,确定目标组件集合,实现获取参与编译检测的全部组件。
90.作为一可选实施例,所述基于表征组件依赖关系的有向无环图,确定与所述第一组件集合中的第一组件形成关联关系的第一目标组件,并基于所述第一目标组件生成第一集合,包括:
91.针对所述第一组件集合中的每个第一组件,基于所述有向无环图,确定依赖所述第一组件的至少一个第一目标组件;
92.根据各第一组件分别对应的第一目标组件,生成所述第一集合。
93.在生成第一集合时,可以针对第一组件集合中的每个第一组件,基于有向无环图查找第一组件关联的第一目标组件,其中,第一组件所关联的第一目标组件可以包括直接依赖第一组件的业务层组件和间接依赖第一组件的业务层组件。在针对每个第一组件,确定依赖第一组件的至少一个第一目标组件之后,将各第一组件分别对应的第一目标组件进行聚合,生成第一集合,实现将第一组件所关联的业务层组件进行汇聚,以便于基于与待集成代码集合关联的业务层组件,查找参与编译检测的全部组件。
94.作为一可选实施例,所述方法还包括:
95.根据目标应用对应的组件架构依赖准则,生成表征组件依赖关系的有向无环图;
96.其中,所述待集成代码集合中的代码文件为所述目标应用的组件代码文件。
97.本技术需要预先获取目标应用对应的组件架构依赖准则,基于所获取的组件架构依赖准则,确定目标应用对应的组件依赖关系,生成表征组件依赖关系的有向无环图。
98.组件架构依赖准则可以包括:上层组件可以依赖下层组件、下层组件不可以依赖上层组件,可以隔层依赖,业务层组件之间不可以相互依赖,中间件层组件、基础库层组件可以在同一层级单向依赖。
99.通过生成有向无环图,可以实现建立完备的组件依赖关系,以便于后续可以直接利用组件依赖关系进行组件的查找。
100.通过预先生成表征组件依赖关系的有向无环图,可以基于组件依赖关系,精准判定出与待集成代码集合相关联的组件并进行源代码编译,可有效控制代码编译范围,将参与源代码编译的组件数控制至最低。
101.下面通过一整体实施流程对本技术提供的代码编译检测方法进行介绍,参见图6所示,包括:
102.步骤601、建立完备的组件依赖关系,生成有向无环图。
103.步骤602、根据待集成代码集合,确定第一组件集合。
104.步骤603、遍历有向无环图、确定包括第一组件集合中的第一组件以及直接依赖第一组件的第二组件的第二组件集合,对第二组件集合对应的源码文件进行编译,生成第二组件集合对应的最新静态库。
105.步骤604、基于有向无环图确定包括第二组件集合中的组件以及与第二组件集合中的组件形成关联关系的第三组件的目标组件集合,第三组件归属于第三组件集合。
106.步骤605、将第二组件集合对应的最新静态库和第三组件集合对应的静态库进行链接。
107.上述实施流程,充分利用编译原理和编译中间产物,基于组件依赖特性,精准筛选出需要参与源码编译的源代码,利用已经编译好的静态库,将与待集成代码集合不相关联的组件直接使用静态库参与编译,可有效控制代码编译范围,将参与源代码编译的组件数控制至最低,最大程度利用已经编译成静态库的组件,从而降低总体编译时间。
108.以上为本技术实施例提供的代码编译检测方法的整体实施方案,在确定待集成代码集合所匹配的第一组件集合后,基于组件依赖关系确定包括第一组件集合中的第一组件以及直接依赖第一组件的第二组件的第二组件集合,对第二组件集合对应的源码文件进行编译,生成第二组件集合对应的最新静态库,并基于组件依赖关系确定目标组件集合,将第二组件集合对应的最新静态库和目标组件集合中第三组件集合对应的静态库进行链接,可以实现基于组件依赖关系,精准判定出与待集成代码集合相关联的组件并进行源代码编译,充分利用已经编译好的静态库,将与待集成代码集合不相关联的组件直接使用静态库参与编译,可有效控制代码编译范围,将参与源代码编译的组件数控制至最低,最大程度利用已经编译成静态库的组件,从而降低总体编译时间,提高代码集成效率,同时保证了待集成代码编译效率和编译正确性的平衡。
109.进一步地,通过针对待集成代码集合中的每个待提交的代码文件,确定代码文件对应的组件标识,将各代码文件对应的组件标识进行聚合,生成第一组件集合,可以实现获
取待集成代码集合所直接涉及的全部组件。
110.通过基于有向无环图查找直接依赖第一组件的第二组件,可以实现确定待集成代码集合所间接涉及的组件;通过将第一组件集合中的第一组件、第一组件对应的第二组件进行聚合确定第二组件集合,可以实现获取待集成代码集合直接涉及以及间接涉及的组件;通过基于组件依赖关系,确定与第一组件关联的不被其他组件依赖的组件、生成第一集合,并基于组件依赖关系,查找关联组件,确定目标组件集合,可实现获取参与编译检测的全部组件。
111.本技术实施例还提供一种代码编译检测装置,参见图7所示,该装置包括:
112.第一确定模块701,用于确定待集成代码集合所匹配的第一组件集合;
113.第一处理模块702,用于基于组件依赖关系和所述第一组件集合确定第二组件集合,并对所述第二组件集合对应的源码文件进行编译,生成所述第二组件集合对应的最新静态库,所述第二组件集合包括所述第一组件集合中的第一组件以及直接依赖所述第一组件的第二组件;
114.第二确定模块703,用于基于所述组件依赖关系确定目标组件集合,所述目标组件集合包括所述第二组件集合中的组件以及与所述第二组件集合中的组件形成关联关系的第三组件,所述第三组件归属于第三组件集合;
115.第二处理模块704,用于将所述第二组件集合对应的最新静态库和所述第三组件集合对应的静态库进行链接。
116.可选地,所述第一确定模块包括:
117.获取子模块,用于针对所述待集成代码集合中的每个代码文件,获取所述代码文件对应的组件标识;
118.第一聚合生成子模块,用于将所述待集成代码集合中各代码文件对应的组件标识进行聚合,生成所述第一组件集合。
119.可选地,所述第一处理模块包括:
120.第一查找子模块,用于基于表征组件依赖关系的有向无环图,针对所述第一组件集合中的每个第一组件,查找直接依赖所述第一组件的第二组件;
121.聚合确定子模块,用于将所述第一组件集合中的第一组件、每个所述第一组件对应的第二组件进行聚合,确定所述第二组件集合。
122.可选地,所述第一处理模块包括:
123.编译生成子模块,用于针对所述第二组件集合中的每个组件,对所述组件对应的源码文件进行编译,生成所述组件对应的最新静态库;
124.第二聚合生成子模块,用于将所述第二组件集合中各组件对应的最新静态库进行聚合,生成所述第二组件集合对应的最新静态库;
125.其中,所述第二组件集合对应的最新静态库存储于编译服务器。
126.可选地,所述第二确定模块包括:
127.确定生成子模块,用于基于表征组件依赖关系的有向无环图,确定与所述第一组件集合中的第一组件形成关联关系的第一目标组件,并基于所述第一目标组件生成第一集合,所述第一目标组件为所述有向无环图中不被其他组件依赖的组件;
128.第二查找子模块,用于针对所述第一集合中的每个第一目标组件,基于所述有向
无环图,查找与所述第一目标组件形成关联关系的第二目标组件;
129.确定子模块,用于根据所述第一集合中第一目标组件、每个所述第一目标组件关联的第二目标组件,确定所述目标组件集合;
130.其中,直接依赖所述第一组件的所述第一目标组件和所述第二目标组件位于所述第二组件集合,属于所述第一组件的所述第一目标组件和所述第二目标组件位于所述第二组件集合。
131.可选地,所述确定生成子模块包括:
132.确定单元,用于针对所述第一组件集合中的每个第一组件,基于所述有向无环图,确定依赖所述第一组件的至少一个第一目标组件;
133.生成单元,用于根据各第一组件分别对应的第一目标组件,生成所述第一集合。
134.可选地,所述装置还包括:
135.生成模块,用于根据目标应用对应的组件架构依赖准则,生成表征组件依赖关系的有向无环图;
136.其中,所述待集成代码集合中的代码文件为所述目标应用的组件代码文件。
137.对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
138.本技术实施例还提供了一种电子设备,包括:处理器,存储器,存储在存储器上并可在处理器上运行的计算机程序,该计算机程序被处理器执行时实现上述代码编译检测方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
139.举例如下,图8示出了一种电子设备的实体结构示意图。如图8所示,该电子设备可以包括:处理器(processor)810、通信接口(communications interface)820、存储器(memory)830和通信总线840,其中,处理器810,通信接口820,存储器830通过通信总线840完成相互间的通信。处理器810可以调用存储器830中的逻辑指令,处理器810用于执行以下步骤:确定待集成代码集合所匹配的第一组件集合;基于组件依赖关系和所述第一组件集合确定第二组件集合,并对所述第二组件集合对应的源码文件进行编译,生成所述第二组件集合对应的最新静态库,所述第二组件集合包括所述第一组件集合中的第一组件以及直接依赖所述第一组件的第二组件;基于所述组件依赖关系确定目标组件集合,所述目标组件集合包括所述第二组件集合中的组件以及与所述第二组件集合中的组件形成关联关系的第三组件,所述第三组件归属于第三组件集合;将所述第二组件集合对应的最新静态库和所述第三组件集合对应的静态库进行链接。处理器810还可以执行本技术实施例中的其他方案,这里不再进一步阐述。
140.此外,上述的存储器830中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本技术各个实施例所述方法的全部或部分步骤。
141.本技术实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述代码编译检测方法实施例的各个过程,
且能达到相同的技术效果,为避免重复,这里不再赘述。其中,所述的计算机可读存储介质,如只读存储器(read-only memory,简称rom)、随机存取存储器(random access memory,简称ram)、磁碟或者光盘等。
142.需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
143.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本技术各个实施例所述的方法。
144.上面结合附图对本技术的实施例进行了描述,但是本技术并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本技术的启示下,在不脱离本技术宗旨和权利要求所保护的范围情况下,还可做出很多形式,均属于本技术的保护之内。
145.本领域普通技术人员可以意识到,结合本技术实施例中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本技术的范围。
146.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
147.在本技术所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
148.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
149.另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
150.所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术的技术方案本质上或者说
对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本技术各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。
151.以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以权利要求的保护范围为准。

技术特征:
1.一种代码编译检测方法,其特征在于,包括:确定待集成代码集合所匹配的第一组件集合;基于组件依赖关系和所述第一组件集合确定第二组件集合,并对所述第二组件集合对应的源码文件进行编译,生成所述第二组件集合对应的最新静态库,所述第二组件集合包括所述第一组件集合中的第一组件以及直接依赖所述第一组件的第二组件;基于所述组件依赖关系确定目标组件集合,所述目标组件集合包括所述第二组件集合中的组件以及与所述第二组件集合中的组件形成关联关系的第三组件,所述第三组件归属于第三组件集合;将所述第二组件集合对应的最新静态库和所述第三组件集合对应的静态库进行链接。2.根据权利要求1所述的方法,其特征在于,所述确定待集成代码集合所匹配的第一组件集合,包括:针对所述待集成代码集合中的每个代码文件,获取所述代码文件对应的组件标识;将所述待集成代码集合中各代码文件对应的组件标识进行聚合,生成所述第一组件集合。3.根据权利要求1所述的方法,其特征在于,所述基于组件依赖关系和所述第一组件集合确定第二组件集合,包括:基于表征组件依赖关系的有向无环图,针对所述第一组件集合中的每个第一组件,查找直接依赖所述第一组件的第二组件;将所述第一组件集合中的第一组件、每个所述第一组件对应的第二组件进行聚合,确定所述第二组件集合。4.根据权利要求1所述的方法,其特征在于,所述对所述第二组件集合对应的源码文件进行编译,生成所述第二组件集合对应的最新静态库,包括:针对所述第二组件集合中的每个组件,对所述组件对应的源码文件进行编译,生成所述组件对应的最新静态库;将所述第二组件集合中各组件对应的最新静态库进行聚合,生成所述第二组件集合对应的最新静态库;其中,所述第二组件集合对应的最新静态库存储于编译服务器。5.根据权利要求1所述的方法,其特征在于,所述基于所述组件依赖关系确定目标组件集合,包括:基于表征组件依赖关系的有向无环图,确定与所述第一组件集合中的第一组件形成关联关系的第一目标组件,并基于所述第一目标组件生成第一集合,所述第一目标组件为所述有向无环图中不被其他组件依赖的组件;针对所述第一集合中的每个第一目标组件,基于所述有向无环图,查找与所述第一目标组件形成关联关系的第二目标组件;根据所述第一集合中第一目标组件、每个所述第一目标组件关联的第二目标组件,确定所述目标组件集合;其中,直接依赖所述第一组件的所述第一目标组件和所述第二目标组件位于所述第二组件集合,属于所述第一组件的所述第一目标组件和所述第二目标组件位于所述第二组件集合。
6.根据权利要求5所述的方法,其特征在于,所述基于表征组件依赖关系的有向无环图,确定与所述第一组件集合中的第一组件形成关联关系的第一目标组件,并基于所述第一目标组件生成第一集合,包括:针对所述第一组件集合中的每个第一组件,基于所述有向无环图,确定依赖所述第一组件的至少一个第一目标组件;根据各第一组件分别对应的第一目标组件,生成所述第一集合。7.根据权利要求3或5所述的方法,其特征在于,所述方法还包括:根据目标应用对应的组件架构依赖准则,生成表征组件依赖关系的有向无环图;其中,所述待集成代码集合中的代码文件为所述目标应用的组件代码文件。8.一种代码编译检测装置,其特征在于,包括:第一确定模块,用于确定待集成代码集合所匹配的第一组件集合;第一处理模块,用于基于组件依赖关系和所述第一组件集合确定第二组件集合,并对所述第二组件集合对应的源码文件进行编译,生成所述第二组件集合对应的最新静态库,所述第二组件集合包括所述第一组件集合中的第一组件以及直接依赖所述第一组件的第二组件;第二确定模块,用于基于所述组件依赖关系确定目标组件集合,所述目标组件集合包括所述第二组件集合中的组件以及与所述第二组件集合中的组件形成关联关系的第三组件,所述第三组件归属于第三组件集合;第二处理模块,用于将所述第二组件集合对应的最新静态库和所述第三组件集合对应的静态库进行链接。9.一种电子设备,其特征在于,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至7中任一项所述的代码编译检测方法的步骤。10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述的代码编译检测方法的步骤。

技术总结
本申请提供一种代码编译检测方法、装置、电子设备及存储介质,该方法包括:确定待集成代码集合匹配的第一组件集合;基于组件依赖关系和第一组件集合确定第二组件集合,对第二组件集合的源码文件进行编译生成第二组件集合的最新静态库,第二组件集合包括第一组件集合中的第一组件和直接依赖第一组件的第二组件;基于组件依赖关系确定目标组件集合,目标组件集合包括第二组件集合中的组件和与第二组件集合中的组件形成关联的属于第三组件集合的第三组件;将第二组件集合的最新静态库和第三组件集合的静态库进行链接。本申请可判定出与待集成代码集合相关联的组件进行源码编译,并利用已经编译好的静态库,可有效控制编译范围,提高代码集成效率。提高代码集成效率。提高代码集成效率。


技术研发人员:彭飞 刘孟
受保护的技术使用者:五八同城信息技术有限公司
技术研发日:2023.03.27
技术公布日:2023/7/22
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐