CN114461217A - 代码编译方法、装置、电子设备及存储介质 - Google Patents
代码编译方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN114461217A CN114461217A CN202111590796.7A CN202111590796A CN114461217A CN 114461217 A CN114461217 A CN 114461217A CN 202111590796 A CN202111590796 A CN 202111590796A CN 114461217 A CN114461217 A CN 114461217A
- Authority
- CN
- China
- Prior art keywords
- source code
- dependency relationship
- module
- code module
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本公开关于一种代码编译方法、装置、电子设备及存储介质。该方法包括:获取当前项目代码中多个源码模块的当前源码依赖关系图以及第一源码模块;将当前源码依赖关系图中的第一源码模块替换为目标编译文件,得到第一中间依赖关系图;基于当前源码依赖关系图,在第一中间依赖关系图中为目标编译文件构建虚拟POM依赖关系图,得到第二中间依赖关系图;基于依赖编译文件对第二中间依赖关系图中的依赖关系进行修正处理,得到目标依赖关系图;基于目标依赖关系图对多个源码模块进行编译处理,得到代码编译文件。根据本公开提供的技术方案,可以提升代码编译的准确性。
Description
技术领域
本公开涉及数据处理技术领域,尤其涉及一种代码编译方法、装置、电子设备及存储介质。
背景技术
代码在使用时会经过编译过程,但是随着代码量的增加,编译耗时越来越多,为了加速编译,相关技术中,发布源码模块的编译文件AAR(Android Archive,安卓库项目的二进制归档文件)时,会将依赖翻译到POM(project object model,项目对象模型)文件中并上传到麦文maven服务器上,通过Maven Url把依赖模块关联起来。后续存在源码模块修改触发的编译过程中,可以直接将未修改的源码模块替换成Maven中对应的AAR以加速编译。这种使用maven服务器中依赖关系的方式,容易导致依赖错误,从而导致编译错误。
发明内容
本公开提供一种代码编译方法、装置、电子设备及存储介质,以至少解决相关技术中如何提高代码编译效率和准确性的问题。本公开的技术方案如下:
根据本公开实施例的第一方面,提供一种代码编译方法,包括:
获取当前项目代码中多个源码模块的当前源码依赖关系图以及第一源码模块,所述第一源码模块为所述多个源码模块中具有对应目标编译文件的任一源码模块;
将所述当前源码依赖关系图中的第一源码模块替换为所述目标编译文件,得到第一中间依赖关系图;
基于所述当前源码依赖关系图,在所述第一中间依赖关系图中为所述目标编译文件构建虚拟项目对象模型POM依赖关系图,得到第二中间依赖关系图;所述虚拟POM依赖关系图表征所述目标编译文件与所述目标编译文件具有依赖关系的依赖编译文件的依赖关系;
基于所述依赖编译文件,对所述第二中间依赖关系图中的依赖关系进行修正处理,得到目标依赖关系图;
基于所述目标依赖关系图对所述多个源码模块进行编译处理,得到代码编译文件。
在一种可能的实现方式中,所述基于所述依赖编译文件,对所述第二中间依赖关系图中的依赖关系进行修正处理,得到所述目标依赖关系图,包括:
确定所述依赖编译文件对应的第二源码模块;
基于所述第二源码模块,对所述虚拟POM依赖关系图中的依赖关系进行修正处理,得到所述目标依赖关系图。
在一种可能的实现方式中,所述基于所述第二源码模块,对所述虚拟POM依赖关系图中的依赖关系进行修正处理,得到所述目标依赖关系图,包括:
将所述虚拟POM依赖关系图中的所述依赖编译文件替换为所述第二源码模块,得到所述目标依赖关系图。
在一种可能的实现方式中,所述基于所述依赖编译文件,对所述第二中间依赖关系图中的依赖关系进行修正处理,得到所述目标依赖关系图,包括:
确定所述依赖编译文件对应的第二源码模块;
若所述项目代码管理系统中不存在与所述第二源码模块匹配的编译文件,将所述第二中间依赖关系图中的所述依赖编译文件替换为所述第二源码模块,得到所述目标依赖关系图;
若所述项目代码管理系统中存在与所述第二源码模块匹配的编译文件,将所述第二中间依赖关系图中所述第二源码模块替换为所述依赖编译文件,得到所述目标依赖关系图。
在一种可能的实现方式中,所述获取第一源码模块,包括:
基于所述当前源码依赖关系图,获取各源码模块的依赖源码模块;所述依赖源码模块为所述多个源码模块中的至少一个;
基于各源码模块以及各源码模块的依赖源码模块,确定各源码模块的模块标识信息;
确定项目代码管理系统中与所述模块标识信息匹配的目标编译文件;
从所述多个源码模块中确定与所述目标编译文件对应的所述第一源码模块。
在一种可能的实现方式中,所述基于各源码模块以及各源码模块的依赖源码模块,确定各源码模块的模块标识信息,包括:
获取各源码模块的摘要信息和所述依赖源码模块的摘要信息;
根据各源码模块的摘要信息以及与各源码模块具有依赖关系的依赖源码模块的摘要信息,确定各源码模块的模块标识信息。
在一种可能的实现方式中,还包括:
检测到代码更新事件,生成待发布源码模块的编译文件以及待发布项目对象模型POM文件,所述待发布源码模块为所述多个源码模块中模块标识信息与编译文件标识信息不匹配的源码模块,所述编译文件标识信息为所述项目代码管理系统中编译文件的标识信息;所述待发布POM文件中的依赖关系为空的依赖关系;
将所述待发布源码模块的编译文件以及所述待发布POM文件发布至所述项目代码管理系统。
根据本公开实施例的第二方面,提供一种代码编译装置,包括:
获取模块,被配置为执行获取当前项目代码中多个源码模块的当前源码依赖关系图以及第一源码模块,所述第一源码模块为所述多个源码模块中具有对应目标编译文件的任一源码模块;
替换模块,被配置为执行将所述当前源码依赖关系图中的第一源码模块替换为所述目标编译文件,得到第一中间依赖关系图;
虚拟POM构建模块,被配置为执行基于所述当前源码依赖关系图,在所述第一中间依赖关系图中为所述目标编译文件构建虚拟项目对象模型POM依赖关系图,得到第二中间依赖关系图;所述虚拟POM依赖关系图表征所述目标编译文件与所述目标编译文件具有依赖关系的依赖编译文件的依赖关系;
修正模块,被配置为执行基于所述依赖编译文件,对所述第二中间依赖关系图中的依赖关系进行修正处理,得到目标依赖关系图;
编译模块,被配置为执行基于所述目标依赖关系图对所述多个源码模块进行编译处理,得到代码编译文件。
在一种可能的实现方式中,所述修正模块包括:
第一确定单元,被配置为执行确定所述依赖编译文件对应的第二源码模块;
第一修正单元,被配置为执行基于所述第二源码模块,对所述虚拟POM依赖关系图中的依赖关系进行修正处理,得到所述目标依赖关系图。
在一种可能的实现方式中,所述第一修正单元包括:
修正子单元,被配置为执行将所述虚拟POM依赖关系图中的所述依赖编译文件替换为所述第二源码模块,得到所述目标依赖关系图。
在一种可能的实现方式中,所述修正模块包括:
第二确定单元,被配置为执行确定所述依赖编译文件对应的第二源码模块;
第二修正单元,被配置为执行若所述项目代码管理系统中不存在与所述第二源码模块匹配的编译文件,将所述第二中间依赖关系图中的所述依赖编译文件替换为所述第二源码模块,得到所述目标依赖关系图;
第三修正单元,被配置为执行若所述项目代码管理系统中存在与所述第二源码模块匹配的编译文件,将所述第二中间依赖关系图中所述第二源码模块替换为所述依赖编译文件,得到所述目标依赖关系图。
在一种可能的实现方式中,所述获取模块包括:
依赖源码模块获取单元,基于所述当前源码依赖关系图,获取各源码模块的依赖源码模块;所述依赖源码模块为所述多个源码模块中的至少一个;
模块标识确定单元,被配置为执行基于各源码模块以及各源码模块的依赖源码模块,确定各源码模块的模块标识信息;
匹配处理单元,被配置为执行确定项目代码管理系统中与所述模块标识信息匹配的目标编译文件;
第一源码模块获取单元,被配置为执行从所述多个源码模块中确定与所述目标编译文件对应的所述第一源码模块。
在一种可能的实现方式中,所述模块标识确定单元包括:
摘要获取子单元,被配置为执行获取各源码模块的摘要信息和所述依赖源码模块的摘要信息;
标识信息确定子单元,被配置为执行根据各源码模块的摘要信息以及与各源码模块具有依赖关系的依赖源码模块的摘要信息,确定各源码模块的模块标识信息。
在一种可能的实现方式中,还包括:
源码发布模块,被配置为执行检测到代码更新事件,生成待发布源码模块的编译文件以及待发布项目对象模型POM文件,所述待发布源码模块为所述多个源码模块中模块标识信息与编译文件标识信息不匹配的源码模块,所述编译文件标识信息为所述项目代码管理系统中编译文件的标识信息;所述待发布POM文件中的依赖关系为空的依赖关系;
上传模块,被配置为执行将所述待发布源码模块的编译文件以及所述待发布POM文件发布至所述项目代码管理系统。
根据本公开实施例的第三方面,提供一种电子设备,包括:处理器;用于存储所述处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令,以实现如上述第一方面中任一项所述的方法。
根据本公开实施例的第四方面,提供一种计算机可读存储介质,当所述计算机可读存储介质中的指令由电子设备的处理器执行时,使得所述电子设备能够执行本公开实施例的第一方面中任一所述的方法。
根据本公开实施例的第五方面,提供一种计算机程序产品,包括计算机指令,所述计算机指令被处理器执行时,使得计算机执行本公开实施例的第一方面中任一项所述的方法。
本公开的实施例提供的技术方案至少带来以下有益效果:
通过在编译时,基于准确的当前源码依赖关系图进行虚拟POM依赖关系图的动态构建,以及基于虚拟POM依赖关系图确定用于编译的目标依赖关系图,可以保证源码模块依赖关系的实时准确性以及实现依赖关系图的无损单点替换,提升目标依赖关系图的准确性;并且这种编译时动态构建虚拟POM依赖关系图的方式,可以实时适应各种应用场景,避免不同应用场景下的依赖错误,进一步提升代码编译的准确性。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。
图1是根据一示例性实施例示出的一种应用环境的示意图。
图2是根据一示例性实施例示出的一种代码编译方法的流程图。
图3是根据一示例性实施例示出的一种获取第一源码模块的方法流程图。
图4是根据一示例性实施例示出的一种源码依赖关系图的示意图。
图5是根据一示例性实施例示出的一种基于各源码模块以及各源码模块的依赖源码模块,确定各源码模块的模块标识信息的方法流程图。
图6是根据一示例性实施例示出的一种确定模块标识信息的流程示意图。
图7a~7g是根据一示例性实施例示出的一种虚拟POM依赖关系图的构建流程示意图。
图8是根据一示例性实施例示出的一种代码编译装置框图。
图9是根据一示例性实施例示出的一种用于代码编译的电子设备的框图。
图10是根据一示例性实施例示出的另一种用于代码编译的电子设备的框图。
具体实施方式
为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。
需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
请参阅图1,图1是根据一示例性实施例示出的一种应用环境的示意图,如图1所示,该应用环境可以包括项目代码管理系统01和终端02。
在一个可选的实施例中,项目代码管理系统01可以用于管理编译后的代码,例如项目代码管理系统01为麦文Maven系统时,可以用于管理代码编译后的编译文件AAR(或称为aar)。其中,项目代码管理系统01可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(Content Delivery Network,内容分发网络)、以及大数据和人工智能平台等基础云计算服务的云服务器。
在一个可选的实施例中,终端02可以用于代码编译处理。具体的,终端02可以包括但不限于智能手机、台式计算机、平板电脑、笔记本电脑、智能音箱、数字助理、增强现实(augmented reality,AR)/虚拟现实(virtual reality,VR)设备、智能可穿戴设备等类型的电子设备。可选的,电子设备上运行的操作系统可以包括但不限于安卓系统、IOS系统、linux、windows等。
此外,需要说明的是,图1所示的仅仅是本公开提供的代码编译方法的一种应用环境。
本说明书实施例中,上述服务器01以及终端02可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。
需要说明的是,以下图中示出的是一种可能的步骤顺序,实际上并不限定必须严格按照此顺序。有些步骤可以在互不依赖的情况下并行执行。本公开所涉及的用户信息(包括但不限于用户设备信息、用户个人信息、用户行为信息等)和数据(包括但不限于用于展示的数据、编译的数据等),均为经用户授权或者经过各方充分授权的信息和数据。
图2是根据一示例性实施例示出的一种代码编译方法的流程图。如图2所示,可以包括以下步骤:
在步骤S201中,获取当前项目代码中多个源码模块的当前源码依赖关系图以及第一源码模块,该第一源码模块为多个源码模块中具有对应目标编译文件的任一源码模块。
本说明书实施例中,当前项目代码可以是指存储在一个代码仓库(例如git仓库)中的代码;该多个源码模块可以是指当前项目代码包括的全部源码模块,即一个git仓库中的全部源码模块。其中,一个源码模块可以对应一个业务功能,本公开对源码模块的划分方式不作限定。可选地,可以在检测到编译事件时,触发该步骤S201,本公开对此不作限定。需要说明的是,当前项目代码中的多个源码模块均可以被更新,例如某个源码模块可以基于业务需求而被代码编写人员修改,或者该多个源码模块中的至少一个源码模块为新增源码模块。实际应用中,可以基于多个源码模块之间的引用关系,确定多个源码模块的当前源码依赖关系图,从而获取当前项目代码中多个源码模块的当前源码依赖关系图。当前源码依赖关系图可以是有向无环图,该当前源码依赖关系图中可以包括多个节点以及节点间的依赖关系,该多个节点可以利用多个源码模块的模块标识信息表示。作为一个示例,前源码依赖关系图可以如图7a所示,其中,A、B、C和D可以是当前项目代码中多个源码模块各自的模块标识信息。
实际应用中,源码模块编译后的编译文件AAR可以上传到Maven系统,基于此,可以从Maven系统中获取当前项目代码的多个编译文件,从而可以从多个编译文件中筛选出与当前多个源码模块匹配的目标编译文件。例如,一个源码模块的源码标识信息和该一个源码模块的编译文件的文件标识信息具有对应关系,或者一个源码模块的源码标识信息和该一个源码模块的编译文件的文件标识信息相同。基于此,可以利用源码标识信息与文件标识信息进行匹配,将与各源码模块的模块标识信息相同或具有对应关系的文件标识信息对应的编译文件,作为各源码模块匹配的目标编译文件。相应地,这些具有匹配的目标编译文件的源码模块可以作为第一源码模块。
在一种可能的实现方式中,为了提升联动更新的准确性,如图3所示,可以通过以下步骤获取第一源码模块:
在步骤S301中,基于当前源码依赖关系图,获取各源码模块的依赖源码模块;依赖源码模块为多个源码模块中的至少一个。
实际应用中,一个源码模块的依赖源码模块可以是指该一个源码模块的依赖关系图中对该一个源码模块可见的源码模块(即可见依赖源码模块)。作为一个示例,可以从当前源码依赖关系图中提取各源码模块的源码依赖关系图,如图4所示的源码模块A的源码依赖关系图,其中虚线部分表示不可传递依赖(implementation),实线部分表示可传递依赖(例如api)。例如,源码模块依赖关系中的可见是指源码模块与可见依赖源码模块之间包括可传递依赖或者包括不可传递的数量小于2。图4中对源码模块A可见的源码模块可以为源码模块B、源码模块C和源码模块D。
可选地,可以基于多个源码模块之间的引用关系,获取各源码模块具有依赖关系的依赖源码模块。即可以基于当前源码依赖关系图中各源码模块的引用关系,获取各源码模块的依赖源码模块。作为一个示例,可以将一个源码模块引用的、且处于预设层级内的源码模块作为该一个源码模块的依赖源码模块,其中,预设层级可以是第一层级或第二层级,本公开对此不作限定。例如源码模块A引用源码模块B,则认为源码模块B处于源码模块A的第一层级;若源码模块B引用源码模块C,则认为源码模块C处于源码模块A的第二层级。
在步骤S303中,基于各源码模块以及各源码模块的依赖源码模块,确定各源码模块的模块标识信息。
本说明书实施例中,为了实现一个源码模块以及依赖该一个源码模块的源码模块能够联动更新编译和联动更新发布,选择基于各源码模块以及各源码模块的依赖源码模块,确定各源码模块的模块标识信息。其中,依赖该一个源码模块的源码模块可以是指该一个源码模块是该源码模块的可见依赖源码模块。例如图4所示,依赖图4中源码模块D的源码模块为源码模块B和源码模块A。若源码模块D有更改,即使源码模块A和源码模块B没有更改,也会因为源码模块D的更改,使得源码模块A和源码模块B各自的模块标识信息发生变更,从而通过本说明书实施例的代码编译方式,能够实现具有依赖关系的源码模块之间的联动更新编译和联动更新发布。
在一个示例中,可以分别提取各源码模块和依赖源码模块的代码内容,从而利用预设函数对代码内容进行处理,得到模块标识信息。这里的预设函数可以是哈希函数或者其它能够实现映射功能的函数,本公开对此不作限定。
在一种可能的实现方式中,如图5所示,该步骤S303可以包括:
在步骤S501中,获取各源码模块的摘要信息和依赖源码模块的摘要信息;
在步骤S503中,根据各源码模块的摘要信息以及各源码模块的依赖源码模块的摘要信息,确定各源码模块的模块标识信息。
实际应用中,可以基于预设摘要算法获取上述摘要信息。其中,预设摘要算法可以包括MD5(Message-Digest Algorithm,信息摘要算法)、SHA1(Secure Hash Algorithm 1,安全散列算法)、SHA512(Secure Hash Algorithm512,安全散列算法)、签名算法等,本公开对此不作限定。
作为一个示例,如图6所示,可以利用MD5对源码模块A本身的内容提取摘要以获取源码模块A的摘要信息A;并可以分别利用MD5对源码模块A的可见依赖模块B、C和D的内容取摘要,以获取源码模块B的摘要信息B、获取源码模块C的摘要信息C、获取源码模块D的摘要信息D。进一步地,可以对摘要信息A、摘要信息B、摘要信息C和摘要信息D进行排序,得到排序后的摘要信息。从而可以对该排序后的摘要信息的内容进行摘要提取,得到源码模块A的模块标识信息。基于同样的方式,可以得到各源码模块的模块标识信息。其中,各源码模块的排序可以是预先设置的。通过各源码模块的摘要信息以及各源码模块的依赖源码模块的摘要信息,确定各源码模块的模块标识信息,可以提升模块标识信息的安全性和准确性。
在步骤S305中,确定项目代码管理系统中与模块标识信息匹配的目标编译文件。
本说明书实施例中,考虑到提升编码效率,可以获取已经编译的源码模块,比如可以从项目代码管理系统中下载该当前项目代码关联的全部编译文件,例如全部AAR文件;其中,在项目代码管理系统中,当前项目代码关联的全部编译文件各自具有对应的文件标识信息,每个编译文件的文件标识信息是基于每个编译文件对应的源码模块以及该对应的源码模块的依赖源码模块确定的,具体可以基于上述步骤S303的实现方式确定,在此不再赘述。也就是说,源码模块A的模块标识信息与源码模块A对应的编译文件A的文件标识信息是相同的,模块标识信息是git仓库中用于唯一标识源码模块的,文件标识信息是maven中用于唯一标识编译文件的。
进一步地,可以利用模块标识信息与maven中的文件标识信息进行匹配,确定与模块标识信息相同的目标文件标识信息;从而可以获取目标文件标识信息对应的目标编译文件。即与模块标识信息匹配的目标编译文件,可以是指目标编译文件的目标文件标识信息与模块标识信息匹配。其中,在maven中能够命中目标编译文件的模块标识信息,从上面模块标识信息的确定方式可以说明:命中目标编译文件的模块标识信息对应的第一源码模块没有代码更新、且对应的依赖源码模块也没有代码更新;这些未进行代码更新的第一源码模块在此次编译过程中可以不用编译,直接跳过,以提升编译效率。并且,基于这种模块标识信息的匹配方式,可以自动且精准的找到第一源码模块,可以提升编译的准确性。
在步骤S307中,从多个源码模块中确定与目标编译文件对应的第一源码模块。
本说明书实施例中,可以从多个源码模块中确定与目标编译文件对应的第一源码模块,即没有发生变化的源码模块。例如,可以从多个源码模块中确定与目标编译文件的文件标识信息相同的模块标识信息对应的源码模块,作为第一源码模块。
通过这种使用当前源码依赖关系图获取依赖源码模块的方式,可以保证依赖源码模块的实时准确性;并且通过各源码模块以及各源码模块的依赖源码模块,确定各源码模块的模块标识信息,以及基于模块标识信息确定目标编译文件,可以自动高效且准确地确定后续需要联动编译的源码模块,提升第一源码模块的准确性,为后续的精准编译提供保障。
在步骤S203中,将当前源码依赖关系图中的第一源码模块替换为目标编译文件,得到第一中间依赖关系图;
在步骤S205中,基于当前源码依赖关系图,在第一中间依赖关系图中为目标编译文件构建虚拟POM依赖关系图,得到第二中间依赖关系图;该虚拟POM依赖关系图表征目标编译文件与目标编译文件具有依赖关系的依赖编译文件的依赖关系;
在步骤S207中,基于依赖编译文件,对第二中间依赖关系图中的依赖关系进行修正处理,得到目标依赖关系图。
参见图7a~7d,介绍虚拟POM依赖关系图的构建过程以及待编译源码模块的确定过程。例如四个源码模块(源码模块A~D)的依赖关系,该依赖关系可以如图7a所示的有向无环图。为了保证该依赖关系的无损,可以基于构建虚拟POM依赖关系图的方式得到目标依赖关系图。假设命中的目标编译文件为C.aar,下面以C.aar为例进行介绍。
具体地,可以将图7a的当前源码依赖关系图中的C替换为C.aar(目标编译文件),得到图7b所示的第一中间依赖关系图。由于C.aar只能指向maven中的AAR,使得该图7b中的C.aar的依赖关系丢失。但是本发明为了避免AAR发布时上传的POM中的依赖关系是固定的,导致不能适应各种应用场景导致依赖关系错误的问题,选择发布时上传的POM文件不包括依赖关系。基于此,这里需要构建C.aar的依赖关系,例如可以基于当前源码依赖关系图,在第一中间依赖关系图中为C.aar构建虚拟POM依赖关系图,得到第二中间依赖关系图,如图7c所示。其中,虚拟POM依赖关系图可以包括C.aar、D.aar以及C.aar指向D.aar的有向边,该D.aar可以看作是C.aar的依赖编译文件。
进一步地,由于图7c中具有D和D.aar,需要进行修正,即需要确定图中的一个节点是源码模块还是编译文件,这样才可以明确是否需要编译。在一种可能的实现方式中,可以确定依赖编译文件对应的第二源码模块,例如D.aar对应的D。并可以基于第二源码模块,对虚拟POM依赖关系图中的依赖关系进行修正处理,得到目标依赖关系图。例如将虚拟POM依赖关系图中的依赖编译文件替换为第二源码模块,得到目标依赖关系图。例如可以利用gradle工具将依赖编译文件替换为第二源码模块,本公开对此不作限定,从而得到目标依赖关系图,如图7d所示。通过将依赖编译文件直接替换为对应的源码模块,使得修正操作比较简单,保证修正的准确执行。
在另一种可能的实现方式中,基于此,可以确定依赖编译文件对应的第二源码模块,例如D.aar对应的D。并且可以对第二中间依赖关系图中的第二源码模块和依赖编译文件进行修正处理,得到目标依赖关系图。具体的修正处理可以包括:
若项目代码管理系统中不存在与第二源码模块匹配的编译文件,将第二中间依赖关系图中的第二源码模块和依赖编译文件替换为第二源码模块;
若项目代码管理系统中存在与第二源码模块匹配的编译文件,将第二中间依赖关系图中第二源码模块和依赖编译文件替换为依赖编译文件。
如图7c为例,若maven中不存在D.aar,可以将D.aar和D合并为D,即将D.aar替换为D,如图7d所示。这样的修正处理方式可以提高修正效率。
需要说明的是,在目标编译文件为多个时,例如命中的目标编译文件包括C.aar和B.aar,可以依次对C.aar和B.aar执行上述S203~S207,以得到目标依赖关系图;或者也可以对C.aar和B.aar并行执行S203~S207。其中,串行执行时,当前执行的目标编译文件可以在前一个目标编译文件执行完毕得到的依赖关系图基础上执行。例如图7d是C.aar执行S203~S207后的依赖关系图,可以在此基础上,对B.aar执行上述S203~S207,从而可以得到目标依赖关系图如图7e所示。或者可以分别执行,得到B.aar的依赖关系图,如图7f所示。从而可以合并图7d和7e,例如将相同的源码模块合并为一个源码模块、将匹配的源码模块和编译文件合并为编译文件,得到目标依赖关系图,如图7e所示。
并行执行中,第二中间依赖关系图可以如图7g所示,从而可以对B.aar的依赖编译文件D.aar以及C.aar的依赖编译文件D.aar进行修正处理,得到目标依赖关系图,如图7e所示。
在步骤S209中,基于目标依赖关系图对多个源码模块进行编译处理,得到代码编译文件。
本说明书实施例中,为了提升编译效率,可以跳过具有对应AAR的源码模块的编译。基于此,可以基于目标依赖关系图对多个源码模块进行编译处理,得到代码编译文件,从而可以跳过目标编译文件。具体编译过程可以使用gradle工具执行,本公开对此不作限定。作为一个示例,该编译处理可以不进行依赖关系的翻译,即POM文件中的依赖关系可以为空。
通过在编译时,基于准确的当前源码依赖关系图进行虚拟POM依赖关系图的动态构建,以及基于虚拟POM依赖关系图确定用于编译的目标依赖关系图,可以保证源码模块依赖关系的实时准确性以及实现依赖关系图的无损单点替换,提升目标依赖关系图的准确性;并且这种编译时动态构建虚拟POM依赖关系图的方式,可以实时适应各种应用场景,避免不同应用场景下的依赖错误,进一步提升代码编译的准确性。
上述的编译文件可以是源码模块发布至maven中,为了给上述代码编译提供可用于匹配以加速编译的编译文件,可以维护一个生产过程,该生产过程可以对用户无感,由代码更新事件触发。具体地,该生产过程可以包括以下步骤:
检测到代码更新事件,生成待发布源码模块的编译文件以及待发布POM文件,该待发布源码模块为多个源码模块中模块标识信息与编译文件标识信息不匹配的源码模块,编译文件标识信息为项目代码管理系统中编译文件的标识信息;项目代码管理系统的待发布POM文件中的依赖关系为空的依赖关系;
将待发布源码模块的编译文件以及待发布POM文件发布至项目代码管理系统。
本说明书实施例中,待发布源码模块可以是指代码发生变更的源码模块,即maven中没有匹配的编译文件对应的源码模块。在检测到代码更新事件时,可以执行上述步骤S201~S209,得到代码更新事件时的编译文件,从而可以从代码更新事件时的编译文件中确定出待发布源码模块的编译文件。并且可以基于当前源码依赖关系图生成该待发布POM文件,该待发布POM文件中的依赖关系为空,例如POM文件中的<dependencis>可以为空。进一步地,可以将待发布源码模块的编译文件以及待发布POM文件发布至项目代码管理系统。这样可以保证项目代码管理系统中在当前时刻具有较全的编译文件,为用户编译代码提供实时有效的服务,以提升用户端代码编译的效率。
图8是根据一示例性实施例示出的一种代码编译装置框图。参照图8,该装置可以包括:
获取模块801,被配置为执行获取当前项目代码中多个源码模块的当前源码依赖关系图以及第一源码模块,所述第一源码模块为所述多个源码模块中具有对应目标编译文件的任一源码模块;
替换模块803,被配置为执行将所述当前源码依赖关系图中的第一源码模块替换为所述目标编译文件,得到第一中间依赖关系图;
虚拟POM构建模块805,被配置为执行基于所述当前源码依赖关系图,在所述第一中间依赖关系图中为所述目标编译文件构建虚拟项目对象模型POM依赖关系图,得到第二中间依赖关系图;所述虚拟POM依赖关系图表征所述目标编译文件与所述目标编译文件具有依赖关系的依赖编译文件的依赖关系;
修正模块807,被配置为执行基于所述依赖编译文件,对所述第二中间依赖关系图中的依赖关系进行修正处理,得到目标依赖关系图;
编译模块809,被配置为执行基于所述目标依赖关系图对所述多个源码模块进行编译处理,得到代码编译文件。
在一种可能的实现方式中,所述修正模块807可以包括:
第一确定单元,被配置为执行确定所述依赖编译文件对应的第二源码模块;
第一修正单元,被配置为执行基于所述第二源码模块,对所述虚拟POM依赖关系图中的依赖关系进行修正处理,得到所述目标依赖关系图。
在一种可能的实现方式中,所述第一修正单元包括:
修正子单元,被配置为执行将所述虚拟POM依赖关系图中的所述依赖编译文件替换为所述第二源码模块,得到所述目标依赖关系图。
在一种可能的实现方式中,所述修正模块807可以包括:
第二确定单元,被配置为执行确定所述依赖编译文件对应的第二源码模块;
第二修正单元,被配置为执行若所述项目代码管理系统中不存在与所述第二源码模块匹配的编译文件,将所述第二中间依赖关系图中的所述依赖编译文件替换为所述第二源码模块,得到所述目标依赖关系图;
第三修正单元,被配置为执行若所述项目代码管理系统中存在与所述第二源码模块匹配的编译文件,将所述第二中间依赖关系图中所述第二源码模块替换为所述依赖编译文件,得到所述目标依赖关系图。
在一种可能的实现方式中,所述获取模块801可以包括:
依赖源码模块获取单元,基于所述当前源码依赖关系图,获取各源码模块的依赖源码模块;所述依赖源码模块为所述多个源码模块中的至少一个;
模块标识确定单元,被配置为执行基于各源码模块以及各源码模块的依赖源码模块,确定各源码模块的模块标识信息;
匹配处理单元,被配置为执行确定项目代码管理系统中与所述模块标识信息匹配的目标编译文件;
第一源码模块获取单元,被配置为执行从所述多个源码模块中确定与所述目标编译文件对应的所述第一源码模块。
在一种可能的实现方式中,所述模块标识确定单元包括:
摘要获取子单元,被配置为执行获取各源码模块的摘要信息和所述依赖源码模块的摘要信息;
标识信息确定子单元,被配置为执行根据各源码模块的摘要信息以及与各源码模块具有依赖关系的依赖源码模块的摘要信息,确定各源码模块的模块标识信息。
在一种可能的实现方式中,该装置还可以包括:
源码发布模块,被配置为执行检测到代码更新事件,生成待发布源码模块的编译文件以及待发布项目对象模型POM文件,所述待发布源码模块为所述多个源码模块中模块标识信息与编译文件标识信息不匹配的源码模块,所述编译文件标识信息为所述项目代码管理系统中编译文件的标识信息;所述待发布POM文件中的依赖关系为空的依赖关系;
上传模块,被配置为执行将所述待发布源码模块的编译文件以及所述待发布POM文件发布至所述项目代码管理系统。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
图9是根据一示例性实施例示出的一种用于代码编译的电子设备的框图,该电子设备可以是终端,其内部结构图可以如图9所示。该电子设备包括通过系统总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该电子设备的处理器用于提供计算和控制能力。该电子设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该电子设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种代码编译的方法。该电子设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该电子设备的输入装置可以是显示屏上覆盖的触摸层,也可以是电子设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图9中示出的结构,仅仅是与本公开方案相关的部分结构的框图,并不构成对本公开方案所应用于其上的电子设备的限定,具体的电子设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
图10是根据一示例性实施例示出的另一种用于代码编译的电子设备的框图,该电子设备可以是服务器,其内部结构图可以如图10所示。该电子设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该电子设备的处理器用于提供计算和控制能力。该电子设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该电子设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种代码编译的方法。
本领域技术人员可以理解,图10中示出的结构,仅仅是与本公开方案相关的部分结构的框图,并不构成对本公开方案所应用于其上的电子设备的限定,具体的电子设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在示例性实施例中,还提供了一种电子设备,包括:处理器;用于存储该处理器可执行指令的存储器;其中,该处理器被配置为执行该指令,以实现如本公开实施例中的代码编译方法。
在示例性实施例中,还提供了一种计算机可读存储介质,当该计算机可读存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行本公开实施例中的代码编译方法。计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
在示例性实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行本公开实施例中的代码编译的方法。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
Claims (10)
1.一种代码编译方法,其特征在于,包括:
获取当前项目代码中多个源码模块的当前源码依赖关系图以及第一源码模块,所述第一源码模块为所述多个源码模块中具有对应目标编译文件的任一源码模块;
将所述当前源码依赖关系图中的第一源码模块替换为所述目标编译文件,得到第一中间依赖关系图;
基于所述当前源码依赖关系图,在所述第一中间依赖关系图中为所述目标编译文件构建虚拟项目对象模型POM依赖关系图,得到第二中间依赖关系图;所述虚拟POM依赖关系图表征所述目标编译文件与所述目标编译文件具有依赖关系的依赖编译文件的依赖关系;
基于所述依赖编译文件,对所述第二中间依赖关系图中的依赖关系进行修正处理,得到目标依赖关系图;
基于所述目标依赖关系图对所述多个源码模块进行编译处理,得到代码编译文件。
2.根据权利要求1所述的方法,其特征在于,所述基于所述依赖编译文件,对所述第二中间依赖关系图中的依赖关系进行修正处理,得到所述目标依赖关系图,包括:
确定所述依赖编译文件对应的第二源码模块;
基于所述第二源码模块,对所述虚拟POM依赖关系图中的依赖关系进行修正处理,得到所述目标依赖关系图。
3.根据权利要求2所述的方法,其特征在于,所述基于所述第二源码模块,对所述虚拟POM依赖关系图中的依赖关系进行修正处理,得到所述目标依赖关系图,包括:
将所述虚拟POM依赖关系图中的所述依赖编译文件替换为所述第二源码模块,得到所述目标依赖关系图。
4.根据权利要求1所述的方法,其特征在于,所述基于所述依赖编译文件,对所述第二中间依赖关系图中的依赖关系进行修正处理,得到所述目标依赖关系图,包括:
确定所述依赖编译文件对应的第二源码模块;
若所述项目代码管理系统中不存在与所述第二源码模块匹配的编译文件,将所述第二中间依赖关系图中的所述依赖编译文件替换为所述第二源码模块,得到所述目标依赖关系图;
若所述项目代码管理系统中存在与所述第二源码模块匹配的编译文件,将所述第二中间依赖关系图中所述第二源码模块替换为所述依赖编译文件,得到所述目标依赖关系图。
5.根据权利要求1所述的方法,其特征在于,所述获取第一源码模块,包括:
基于所述当前源码依赖关系图,获取各源码模块的依赖源码模块;所述依赖源码模块为所述多个源码模块中的至少一个;
基于各源码模块以及各源码模块的依赖源码模块,确定各源码模块的模块标识信息;
确定项目代码管理系统中与所述模块标识信息匹配的目标编译文件;
从所述多个源码模块中确定与所述目标编译文件对应的所述第一源码模块。
6.根据权利要求5所述的方法,其特征在于,所述基于各源码模块以及各源码模块的依赖源码模块,确定各源码模块的模块标识信息,包括:
获取各源码模块的摘要信息和所述依赖源码模块的摘要信息;
根据各源码模块的摘要信息以及与各源码模块具有依赖关系的依赖源码模块的摘要信息,确定各源码模块的模块标识信息。
7.一种代码编译装置,其特征在于,包括:
获取模块,被配置为执行获取当前项目代码中多个源码模块的当前源码依赖关系图以及第一源码模块,所述第一源码模块为所述多个源码模块中具有对应目标编译文件的任一源码模块;
替换模块,被配置为执行将所述当前源码依赖关系图中的第一源码模块替换为所述目标编译文件,得到第一中间依赖关系图;
虚拟POM构建模块,被配置为执行基于所述当前源码依赖关系图,在所述第一中间依赖关系图中为所述目标编译文件构建虚拟项目对象模型POM依赖关系图,得到第二中间依赖关系图;所述虚拟POM依赖关系图表征所述目标编译文件与所述目标编译文件具有依赖关系的依赖编译文件的依赖关系;
修正模块,被配置为执行基于所述依赖编译文件,对所述第二中间依赖关系图中的依赖关系进行修正处理,得到目标依赖关系图;
编译模块,被配置为执行基于所述目标依赖关系图对所述多个源码模块进行编译处理,得到代码编译文件。
8.一种电子设备,其特征在于,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述指令,以实现如权利要求1至6中任一项所述的代码编译方法。
9.一种计算机可读存储介质,其特征在于,当所述计算机可读存储介质中的指令由电子设备的处理器执行时,使得所述电子设备能够执行如权利要求1至6中任一项所述的代码编译方法。
10.一种计算机程序产品,包括计算机指令,其特征在于,所述计算机指令被处理器执行时实现权利要求1至6中任一项所述的代码编译方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111590796.7A CN114461217A (zh) | 2021-12-23 | 2021-12-23 | 代码编译方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111590796.7A CN114461217A (zh) | 2021-12-23 | 2021-12-23 | 代码编译方法、装置、电子设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114461217A true CN114461217A (zh) | 2022-05-10 |
Family
ID=81407056
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111590796.7A Pending CN114461217A (zh) | 2021-12-23 | 2021-12-23 | 代码编译方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114461217A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114924788A (zh) * | 2022-07-20 | 2022-08-19 | 北京达佳互联信息技术有限公司 | 代码同步方法和装置 |
WO2024051290A1 (zh) * | 2022-09-09 | 2024-03-14 | 深圳Tcl新技术有限公司 | 代码编译方法、装置、存储介质及电子设备 |
-
2021
- 2021-12-23 CN CN202111590796.7A patent/CN114461217A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114924788A (zh) * | 2022-07-20 | 2022-08-19 | 北京达佳互联信息技术有限公司 | 代码同步方法和装置 |
WO2024051290A1 (zh) * | 2022-09-09 | 2024-03-14 | 深圳Tcl新技术有限公司 | 代码编译方法、装置、存储介质及电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20160078368A1 (en) | Artificial intelligence & knowledge based automation enhancement | |
CN114461217A (zh) | 代码编译方法、装置、电子设备及存储介质 | |
CN109542461A (zh) | 应用安装包的发布方法、终端设备及介质 | |
US9384020B2 (en) | Domain scripting language framework for service and system integration | |
US20220198003A1 (en) | Detecting added functionality in open source package | |
CN107844313B (zh) | 一种Android中SDK版本升级方法及装置 | |
US11816458B2 (en) | Method and system for packaging infrastructure as code | |
CN114528008A (zh) | 基于分布式版本控制系统的代码管控方法、设备及介质 | |
CN109597796A (zh) | 文件内容修改方法、装置及计算机可读存储介质 | |
CN115185550A (zh) | 服务部署方法、装置、计算机设备及存储介质 | |
CN114064073A (zh) | 软件版本升级方法、装置、计算机设备和存储介质 | |
US11099837B2 (en) | Providing build avoidance without requiring local source code | |
CN116560683A (zh) | 软件更新方法、装置、设备及存储介质 | |
CN111191797A (zh) | 信息处理方法、装置、电子设备及存储介质 | |
CN113515322B (zh) | 应用程序加载方法、装置、计算机设备和可读存储介质 | |
CN109766084B (zh) | 支付应用的定制开发方法、装置、计算机设备和存储介质 | |
CN108897772B (zh) | 数据源补充方法、装置、计算机设备和存储介质 | |
US20190325341A1 (en) | Artificial intelligence & knowledge based automation enhancement | |
JP5943753B2 (ja) | 仮想マシン管理システム、仮想マシン管理方法およびプログラム | |
CN111400243B (zh) | 基于流水线服务的研发管理系统以及文件存储方法、装置 | |
CN113835731A (zh) | 根据更新组件提示出错方法、装置、电子设备及存储介质 | |
CN114356379A (zh) | 基于备份的服务升级方法、装置、设备及存储介质 | |
CN114527993A (zh) | 应用程序部署方法、装置、设备及介质 | |
CN113434122A (zh) | 多角色页面创建方法、装置、服务器及可读存储介质 | |
JP6705482B2 (ja) | システム構築パラメータ管理装置、システム構築パラメータ管理システム、システム構築パラメータ管理方法、及び、システム構築パラメータ管理プログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |