CN110457040B - 用于源代码分布式构建的方法和装置 - Google Patents
用于源代码分布式构建的方法和装置 Download PDFInfo
- Publication number
- CN110457040B CN110457040B CN201810432162.0A CN201810432162A CN110457040B CN 110457040 B CN110457040 B CN 110457040B CN 201810432162 A CN201810432162 A CN 201810432162A CN 110457040 B CN110457040 B CN 110457040B
- Authority
- CN
- China
- Prior art keywords
- construction
- source file
- local
- server
- information
- 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.)
- Active
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
-
- 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/44—Encoding
- G06F8/447—Target code generation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Transfer Between Computers (AREA)
- Stored Programmes (AREA)
Abstract
本发明的实施例涉及一种用于源代码分布式构建的方法和装置。用于源代码分布式构建的方法包括:开始源代码构建;当待构建源文件不可见时,针对所述待构建源文件向构建服务器发起构建请求;根据所述构建服务器返回的信息向所述构建服务器同步工作空间;接收所述构建服务器返回的构建结果。本发明实施例的技术方案可以确保源文件的安全性和二进制兼容性。
Description
技术领域
本申请涉及计算机技术领域,具体而言,涉及一种用于源代码分布式构建的方法和装置。
背景技术
在项目特别是中大型项目的开发和测试过程中,项目中的一些核心代码(或私有代码、保密代码)出于知识产权、代码安全性等原因,通常由单独人员(保密代码开发人员)进行维护,并且对除保密代码开发人员之外的其他开发人员(即,普通开发人员)不可见。
这些私有或保密代码通常存放在全局代码仓库的某个分支或者另一个代码仓库中,并单独配置权限给保密代码开发人员。此外,私有或保密代码开发人员通常将代码形成SDK(Software Development Kit,软件开发包)提供给普通开发人员,定义统一的规范接口并进行SDK版本迭代,以保证私有或保密代码的上下游模块的同步开发。
普通开发人员在进行软件开发时,可能会使用保密模块API(ApplicationProgramming Interface,应用程序编程接口)。
因此,需要在确保保密代码安全的情况下,方便可靠地构建本地源代码。
需要说明的是,在上述背景技术部分公开的信息仅用于加强对本发明的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
本发明的实施例涉及一种用于源代码分布式构建的方法和装置,可以在部分代码对本地不可见的情况下,方便可靠地构建本地源代码。
根据本发明实施例的一方面,提供一种用于源代码分布式构建的方法,所述方法包括:开始源代码构建;当待构建源文件不可见时,针对所述待构建源文件向所述构建服务器发起构建请求;根据所述构建服务器返回的信息向所述构建服务器同步工作空间;接收所述构建服务器返回的构建结果。
在本发明的一些实施例中,所述构建源文件可以包括一个或多个源代码文件。
根据本发明实施例的一方面,提供了一种用于源代码分布式构建的方法,所述方法包括:从本地构建端接收构建要素;根据所述构建要素建立所述本地构建端的编译环境的镜像工作空间;在所述镜像工作空间构建待构建源文件并得到构建结果;向所述本地构建端返回所述构建结果。
在本发明的一些实施例中,所述方法还可以包括:将所述构建结果储存在缓存中。
在本发明的一些实施例中,所述方法还可以包括:访问保密代码仓库;维护所述待构建源文件的多个版本。
根据本发明实施例的一方面,提供了一种用于源代码分布式构建的装置,包括:构建单元,配置为进行源代码构建;查询单元,配置为当待构建源文件不可见时,向所述构建服务器进行关于所述待构建源文件的查询;同步单元,配置为向所述构建服务器同步工作空间;接收单元,配置为接收所述构建服务器返回的构建结果。
在本发明的一些实施例中,查询单元可以用于:根据构建描述脚本中描述的版本信息和源文件路径信息向所述构建服务器进行查询。
在本发明的一些实施例中,同步单元可以用于:从所述构建服务器接收所述待构建源文件的直接依赖项的信息;对所述直接依赖项进行编译依赖分析,获得所述待构建源文件的间接依赖项的信息;将构建要素发送至所述构建服务器,所述构建要素包括所述直接依赖项和所述间接依赖项。
在本发明的一些实施例中,该用于源代码分布式构建的装置还包括编译单元,在待构建源文件可见时,对所述待构建源文件进行编译。
根据本发明实施例的一方面,提供了一种用于源代码分布式构建的装置,包括:同步单元,配置为从本地构建端接收构建要素,且根据所述构建要素建立所述本地构建端的编译环境的镜像工作空间;构建单元,配置为在所述镜像工作空间构建待构建源文件并得到构建结果;结果返回单元,向所述本地构建端返回所述构建结果。
在本发明的一些实施例中,该用于源代码分布式构建的装置还可以包括:接收单元,配置为从本地构建端接收关于待构建源文件的构建查询信息;获取单元,配置为根据所述构建查询信息获取所述待构建源文件;分析单元,配置为获取所述待构建源文件的直接依赖项的信息;交互单元,配置为向所述本地构建端返回所述直接依赖项的信息,以使所述本地构建端对所述直接依赖项进行编译依赖分析而获得所述待构建源文件的间接依赖项的信息。
在本发明的一些实施例,该用于源代码分布式构建的装置还可以包括储存单元,将所述构建结果储存在缓存中。
在本发明的一些实施例中,该用于源代码分布式构建的装置还可以包括:访问单元,访问保密代码仓库;维护单元,维护所述待构建源文件的多个版本。
根据本发明实施例的一方面,提供了一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现如上所述的源代码分布式构建的方法。
根据本发明实施例的一方面,提供了一种电子设备,包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如上所述的源代码分布式构建的方法。
在本发明的一些实施例所提供的技术方案中,在本地进行编译依赖分析并将本地的构建要素发送至构建服务器,实现了本地和构建服务器的构建环境同步。进一步地,在构建环境与本地同步的构建服务器对本地不可见的源文件进行编译,这样可以确保源文件的安全性和二进制兼容性。另外,在本发明的一些实施例所提供的技术方案中,由于不需要对诸如保密代码的源代码进行单独的维护,因此维护成本较低。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本发明。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明的原理。显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1示出了可以应用本发明实施例的用于源代码分布式构建的方法或用于源代码分布式构建的装置的示例性系统架构的示意图;
图2示出了适于用来实现本发明实施例的电子设备的计算机系统的结构示意图;
图3示出了根据本发明的示例性实施例的用于源代码分布式构建的方法的流程图;
图4示出了根据本发明实施例的本地端向构建服务器同步工作空间的过程;
图5示出了根据本发明的示例性实施例的用于源代码分布式构建的方法的流程图;
图6A示出了根据本发明的示例性实施例的在本地构建端与构建服务器之间实现用于源代码分布式构建的方法的示意图;
图6B示出了根据本发明的示例性实施例的构建服务器获取的源文件直接包含的头文件的信息;
图6C示出了根据本发明的示例性实施例获得的头文件直接和间接包含的所有头文件;
图7和图8示出了根据本发明的示例性实施例的用于源代码分布式构建的装置的框图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本发明将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本发明的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本发明的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本发明的各方面。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
图1示出了可以应用本发明实施例的用于源代码分布式构建的方法或用于源代码分布式构建的装置的示例性系统架构100的示意图。
如图1所示,系统架构100可以包括本地端设备101、102、103中的一种或多种,网络104和服务器105。网络104用以在本地端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
应该理解,图1中的本地端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的本地端设备、网络和服务器。比如服务器105可以是多个服务器组成的服务器集群等。
用户可以使用本地端设备101、102、103通过网络104与服务器105交互,以接收或发送消息等。本地端设备101、102、103可以是具有显示屏的各种电子设备,包括但不限于平板电脑、便携式计算机和台式计算机等等。
图1示出的系统架构100可用于一种软件开发组织架构形式。例如,在大型项目的开发测试过程中,整个系统被划分为通过网络协议进行交互的多个服务,如广告系统中的广告展示,广告选取,广告定向,广告检索等等。一个服务的内部实现又划分为多个子模块,子模块间通过代码接口进行交互。项目中一些核心代码(或私有代码、保密代码)出于知识产权、代码安全等方面的考虑,期望单独维护,对其他开发者不可见。
这时,普通开发人员可使用本地端设备101、102进行普通业务软件开发,保密代码开发人员使用本地端设备103进行保密代码开发。使用本地端设备101、102的普通开发人员可能会使用到保密代码模块的API。开发人员可通过网络104利用服务器105进行源代码管理和构建管理。
这里所说的构建管理,可以是例如基于声明式的构建描述脚本和预定义的构建规则,基于开发者声明的某个规则要构建的目标、目标的源代码及其直接依赖的其它目标,完成完整编译或编译链接过程。具体的编译/链接命令根据构建规则而有所不同,可通过构建管理自动触发。
为了在确保保密代码安全的情况下方便可靠地构建本地端设备101、102上的本地源代码,可采用预编译库构建方式。
预编译库构建是与源代码构建相对的一种构建方式。源代码构建中,例如,一个项目各个模块及其依赖的源代码处于同一工作空间中,项目构建发起时递归的自底向上逐个构建,最终输出二进制可执行文件或者jar等格式的发布包,可以直接部署到测试生产环境。而在预编译库构建中,例如,某个子模块是以预编译库(SDK,C/C++静态库,或Java Jar包等)的形式存在于工作空间中,其无需编译等处理过程,可直接用于后续的链接或打包。这里所说的工作空间,可以是例如一个项目完整的代码拷贝,包含目录结构、文件等。
预编译库构建虽然保证了保密代码的安全性,但是也存在诸多缺点。
例如,需要单独的维护,因此维护成本较高。保密代码有变更时需要做版本发布,为了保证发布版本的可用性和稳定性,每个版本需要和相关联模块做大量的集成测试。此外,与保密代码关联的上下游模块的代码处于全局分支,因此在保密模块、上下游模块同步迭代开发中还需要代码整合,存在代码分支管理的代价。
此外,对于一些代码例如C/C++代码,存在二进制兼容风险。这不利于后续升级,诸如编译器升级、编译选项变更和编译环境变更等。
本申请提出了一种源代码分布式构建的方法和系统,引入构建服务器(例如,图1中的服务器105)构建保密代码。普通开发者在本地端设备101、102中发起构建时,对于构建链中的保密代码,在服务器105中重建一份镜像工作空间。通过本地端设备101、102与服务器105交互,使得镜像空间和开发者本地工作空间实现同步(目录结构、文件布局、文件内容、命令行选项等)。构建服务器可从保密代码服务器导入保密代码源文件。构建服务器可实时构建并返回构建结果,既保证了代码的安全性,又保证了构建结果的二进制兼容性,取得了源代码构建的效果。
此外,保密代码的头文件、文档可与普通代码同处于全局代码分支,仅源文件位于保密分支。通过配置保密版本描述文件,普通开发者在构建中可以选取保密代码的特定版本。而保密开发者进行开发时,通过恰当的代码目录布局,可以将两份代码(普通代码、保密代码)合二为一,修改保密代码以后发起构建,自动选取本地的保密代码而不访问构建服务器,就如同两份代码在同一工作空间中,有效的减少了维护管理的代价。
本申请的技术方案不仅可应用于保密代码的构建,也可以应用于例如网络协作开发时的私有代码构建等场景,本申请对此不做限制。
图2示出了适于用来实现本发明实施例的电子设备的计算机系统的结构示意图。
需要说明的是,图2示出的电子设备的计算机系统200仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图2所示,计算机系统200包括中央处理单元(CPU)201,其可以根据存储在只读存储器(ROM)202中的程序或者从储存部分208加载到随机访问存储器(RAM)203中的程序而执行各种适当的动作和处理。在RAM 203中,还存储有系统操作所需的各种程序和数据。CPU201、ROM202以及RAM 203通过总线204彼此相连。输入/输出(I/O)接口205也连接至总线204。
以下部件连接至I/O接口205:包括键盘、鼠标等的输入部分206;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分207;包括硬盘等的储存部分208;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分209。通信部分209经由诸如因特网的网络执行通信处理。驱动器210也根据需要连接至I/O接口205。可拆卸介质211,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器210上,以便于从其上读出的计算机程序根据需要被安装入储存部分208。
特别地,根据本发明的实施例,下文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分209从网络上被下载和安装,和/或从可拆卸介质211被安装。在该计算机程序被中央处理单元(CPU)201执行时,执行本申请的系统中限定的各种功能。
需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本发明实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现,所描述的单元也可以设置在处理器中。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定。
作为另一方面,本申请还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该电子设备执行时,使得该电子设备实现如下述实施例中所述的方法。例如,所述的电子设备可以实现如图3、图4或图5所示的各个步骤。
图3示出了根据本发明的示例性实施例的用于源代码分布式构建的方法的流程图,其可以在例如如图1中所示的本地端设备102或101中执行。如图3中所示,根据本实施例的用于源代码分布式构建的方法可以包括S310~S330。
在S310,开始源代码构建。根据本发明实施例,在项目的某个阶段,普通开发者发起本地源代码构建。例如,基于声明式的构建描述脚本和预定义的构建规则,基于开发者声明的某个规则要构建的目标、目标的源代码及其直接依赖的其它目标,在本地端开始执行构建。如前所述,对于构建链中的保密代码,本地是不能进行构建的,而是通过S320进行。
下面是一个构建描述脚本中预定义的构建规则的示例:
在前述示例中,预定义规则cc_library功能是将.cc文件通过编译产生.o文件,并进一步产生静态库,可用于后续的链接。name表示目标名,可生成libsearch_service.a,包含srcs中编译产生的.o文件。srcs表示源文件,这里涉及三个源文件search_service_A.cc、search_service_B.cc和search_service_C.cc,其中源文件search_service_A.cc的完整路径可为//ad/service/search/search_service_A.cc,这三个源文件编译产生search_service_A.o、search_service_B.o和search_service_C.o。deps表示依赖,例如search_service_A可include并引用common/rpc:rpc中srcs(头文件、源文件)中声明和定义的函数和类。extra_cppflags表示额外的编译选项,用于.cc文件编译产生.o文件阶段。secure表示是否是保密代码,默认为False,即普通代码。secure_version表示保密代码的版本,secure=True时生效,可用于构成保密源文件的标识,例如“//ad/service/search/search_service_A.cc:134567”。
在S320,当待构建源文件不可见时,针对所述待构建源文件向所述构建服务器发起构建请求。
如前所述,在项目特别是中大型项目的开发及测试中,整个项目通常被划分为由不同开发者进行开发的多个子模块。然而,项目中的一些源文件出于知识产权、代码安全等原因,对其他开发者是不可见的,这样的源文件可以称为保密源文件、保密代码或私有代码。保密源文件、保密代码或私有代码通常由特定开发人员来开发并且对其他开发人员不可见。
根据本发明的一些实施例,可以将保密源文件储存在构建服务器中的保密代码分支,例如,可以在构建服务器中设置保密代码或私有代码数据库,并将保密源文件储存在私有代码数据库中。另外,可以将保密源文件的接口文件、头文件和文档等与普通源文件(即,非保密源文件)储存在普通代码仓库或全局主干分支,即对所有开发者可见。例如,可将保密源文件储存在构建服务器中的非私有代码数据库中。
根据本发明的一些实施例,对于需要保密的源文件可以在构建描述脚本中进行声明。另外,保密源文件可以包括多个版本,在构建描述脚本中可以描述保密源文件的版本信息,此外还可以描述保密源文件在构建服务器中的源文件路径。
在该步骤中,当在本地进行源文件构建时,如果待构建源文件对本地不可见,例如,待构建源文件对普通开发者来讲是保密代码时,本地端可针对所述待构建源文件向所述构建服务器发起构建请求。
根据本发明的一些实施例,可以根据构建描述脚本中描述的版本信息(例如,版本号)和源文件路径信息向构建服务器进行查询。例如,根据前述的路径版本标识“//ad/service/search/search_service_A.cc:134567”进行查询。
举例而言,构建系统可以将编译命令的执行转交给预设的命令行程序,其首先检测待构建源文件对本地是否可见,换言之,待构建源文件是否存在于本地。在待构建源文件对本地不可见时,或者说,在本地不存在待构建源文件时,命令行程序根据构建描述脚本中描述的待构建源文件的版本信息和源文件路径信息向构建服务器查询该待构建源文件。
例如,在前述构建示例中,若secure=True,可执行:“securecc--secure_version=134567gcc–c–o ad/service/search/search_service_A.o{OPTIONS}{INCLUDE_PATHS}–Werror–fno-exception ad/service/search/search_service_A.cc”,OPTIONS和INCLUDE_PATHS表示全局配置的编译选项和#include搜索路径,securecc可解析命令行参数,分析得出具体的每个编译要素(例如,编译选项、头文件包含路径、编译器信息等),并判断本地是否存在ad/service/search/search_service_A.cc,进而决定是本地编译还是向服务器发起远程编译请求。
在S330,根据所述构建服务器返回的信息向所述构建服务器同步工作空间。
根据本发明实施例,通过本地端设备101、102与构建服务器(例如,服务器105)交互,使得构建服务器上的镜像空间和开发者本地工作空间实现同步(目录结构、文件布局、文件内容、命令行选项等)。构建服务器可从保密代码服务器导入保密代码源文件。构建服务器可构建并返回构建结果,既保证了代码的安全性,又保证了构建结果的二进制兼容性,取得了源代码构建的效果。本地端向所述构建服务器同步工作空间的过程可通过例如后面参照图4所描述的方法进行。
在S340,接收所述构建服务器返回的构建结果。在构建服务器利用与本地同步的编译环境完成对第一源代码的编译时,本地可以接收构建服务器返回的编译结果。例如,返回的编译结果可以包括目标文件数据流、编译警告错误等。
易于理解,出于执行效率等考虑,前述的待构建源文件可包括一个或多个源代码文件。
另外,易于理解,在源文件对本地可见时,可以在本地对源文件进行编译。例如,这样的源文件可以是本地代码或异地代码,只要其对本地可见即可。
例如,在前述构建示例中,若secure=False,即默认情况,文件在本地,发起构建时执行的命令行可为:“gcc–c–o ad/service/search/search_service_A.o{OPTIONS}{INCLUDE_PATHS}–Werror–fno-exception ad/service/search/search_service_A.cc”,其中OPTIONS和INCLUDE_PATHS表示全局配置的编译选项和#include搜索路径。
对于保密开发者而言,其具备保密代码的读写权限。在这种情况下,可以在本地对保密代码进行开发、构建,然后可提交至保密代码仓库或分支,构建服务器105通过访问该保密代码仓库或分支获取到本次提交的新版本的保密代码。因此可见,根据本发明实施例的用于构建源文件的方法也便于诸如保密代码的源代码的维护。
图4示出了根据本发明实施例的本地端向构建服务器同步工作空间的过程。下面对图4所示的方法进行详细说明。易于理解,根据本发明实施例的同步过程不限于此。
在S410,从所述构建服务器接收所述待构建源文件的直接依赖项的信息。
依赖指编译依赖。头文件的包含关系是一种依赖。例如,若s.c包含了x.h,则称s.c依赖x.h,x.h是s.c的直接依赖项。若x.h包含了y.h,则称作x.h依赖y.h。依赖关系会进行传导,如s.c包含了x.h,x.h包含y.h,而y.h又包含了z.h,则s.c通过x.h依赖y.h和z.h,y.h和z.h是s.c的间接依赖项。
对于C/C++,可从构建服务器获取待构建源文件直接包含(例如,直接#include)的头文件路径的信息。
在S420,对所述直接依赖项进行编译依赖分析,获得所述待构建源文件的间接依赖项的信息。
例如,对于C/C++,对待构建源文件直接包含的头文件进行本地编译依赖分析,进而得到编译所需的位于当前工作空间中的所有头文件。很多编译器提供有分析编译依赖的功能,如gcc的-M或–MM选项。
在S430,将构建要素发送至所述构建服务器,所述构建要素包括所述直接依赖项和所述间接依赖项。此外,根据一些实施例,构建要素还可以包括目录结构、依赖项搜索路径、编译选项和编译器信息中的一个或更多个。
例如,可以利用例如命令行程序将构建要素发送至构建服务器,从而将本地的构建环境同步到构建服务器,以在构建服务器实现相同的构建环境。
这样,构建服务器可利用本地发送的构建要素形成与本地同步的编译环境,从而构建服务器可以在与本地相同的编译环境下对待构建源文件进行编译。由于采用与本地同步的编译环境,所以对于例如C/C++代码,可以避免二进制兼容风险。由此,在构建服务器对诸如保密代码的第一源代码进行编译,可以确保第一源代码的安全性。
以上描述的根据本发明实施例的用于源代码分布式构建的方法可以在例如本地端设备102或101上执行。
下面将参照图5来描述根据本发明实施例的在例如服务器105上执行的用于源代码分布式构建的方法。
图5示出了根据本发明的示例性实施例的用于源代码分布式构建的方法的流程图,其可以在例如如图1中所示的服务器105执行。
如图5中所示,根据本实施例的用于源代码分布式构建的方法可以包括S550~S580。
如图5中所示,根据本发明的一些实施例,用于源代码分布式构建的方法在进行步骤S550~S580之前还可以包括步骤S510~S540。
下面将首先描述步骤S510~S540,然后再描述步骤S550~S580。
在S510,从本地构建端接收关于待构建源文件的构建查询信息。
根据本发明的一些实施例,在构建过程中,当待构建源文件对本地不可见时,可以向构建服务器查询该待构建源文件。此时,构建服务器接收到关于待构建源文件的查询信息。待构建源文件可以是例如保密源文件,即,该文件仅对特定开发者可见。
根据本发明的一些实施例,作为保密源文件的待构建源文件可以储存在构建服务器中的保密代码分支,作为保密源文件的待构建源文件的头文件可以与文档和普通源文件(即,非保密源文件)一起储存在构建服务器的全局代码分支。
根据本发明的一些实施例,构建服务器可以维护待构建源文件的多个版本。即,待构建源文件可以包括多个版本,该多个版本的待构建源文件可以储存在构建服务器中。可以在构建描述脚本中描述待构建源文件的版本信息(例如,表示第几版本的版本号),此外还可以在构建描述脚本中描述待构建源文件在构建服务器中的文件路径。
根据本发明的一些实施例,查询信息可以包括待构建源文件的版本信息和源文件路径信息。
在S520,根据所述构建查询信息获取所述待构建源文件。
在一些实施例中,构建服务器可以根据待构建源文件的版本信息和源文件路径信息来获取待构建源文件。
在S530,获取所述待构建源文件的直接依赖项的信息。例如,对于C/C++,可以获取待构建源文件直接包含(例如,直接#include)的头文件路径的信息。
在S540,向所述本地构建端返回所述直接依赖项的信息,以使所述本地构建端对所述直接依赖项进行编译依赖分析而获得所述待构建源文件的间接依赖项的信息。
例如,对于C/C++,向本地构建端返回待构建源文件直接包含的头文件信息,从而本地构建端可对该头文件进行本地编译依赖分析,进而得到编译所需的位于当前工作空间中的所有头文件。
在S550,从所述本地构建端接收构建要素。在本发明的一些实施例中,所述构建要素可以包括所述直接依赖项和所述间接依赖项,且所述构建要素还包括本地端源代码的目录结构、依赖项搜索路径、编译选项和编译器信息中的一个或更多个。
例如,在本地构建端完成对该头文件的本地编译依赖分析并进而得到编译所需的位于当前工作空间中的所有头文件之后,将待构建源文件直接依赖和间接依赖的所有头文件以及其他构建要素发送至构建服务器,从而将本地端设备处的编译环境同步到构建服务器上。换言之,构建服务器从本地构建端接收构建要素,从而可以建立与本地构建端相同的编译环境。
在S560,根据所述构建要素建立所述本地构建端的编译环境的镜像工作空间。
根据本发明实施例,构建服务器利用本地构建端上传的编译要素(例如,目录结构,头文件路径和内容等等),建立镜像工作空间(例如,创建目录,写头文件等),执行编译命令并返回构建结果。镜像工作空间可以重用,实现增量同步,减少多次构建时不必要的上传和目录创建。
在S570,在所述镜像工作空间构建所述待构建源文件并得到构建结果。
根据本发明实施例,构建服务器在镜像工作空间中利用与本地构建端相同的编译环境来编译待构建源文件。由于采用与本地构建端同步的编译环境,所以对于例如C/C++代码,可以避免二进制兼容风险。此外,在构建服务器对诸如保密代码的第一源代码进行编译,可以确保第一源代码的安全性。
在S580,向所述本地构建端返回所述构建结果。例如,可以将包括目标文件数据流、编译警告错误等的编译结果返回给本地构建端。
根据本发明的一些实施例,可以将源代码分布式构建的结果和/或过程储存在缓存中。例如,可以在构建服务器中设置缓存,以缓存源代码分布式构建的过程和/或结果,从而可以提升构建服务器的效率,减少重复构建。
根据本发明一些实施例,构建服务器通过访问保密代码仓库提取保密代码。另外,构建服务器可维护所述待构建源文件的多个版本。
下面参照图6A,详细描述根据本发明实施例的一个源代码分布式构建的示例。
图6A示出了根据本发明的示例性实施例的在本地构建端与构建服务器之间实现用于源代码分布式构建的方法的示意图。
如图6A所示,在源文件的构建过程中,本地端构建工具首先检查在本地构建端是否存在源文件。
当在本地不存在源文件时,即,当源文件对本地不可见时,如附图标记B1所示,构建工具可根据构建描述脚本中所描述的源文件路径和版本信息向构建服务器进行查询。例如,一个示例是源文件路径和版本信息为“//ad/service/search/search_service_A.cc:134567”。
当构建服务器接收到关于源文件的查询信息时,其根据包括源文件路径和版本信息的查询信息在构建服务器中获取与信息“//ad/service/search/search_service_A.cc:134567”相应的文件。构建服务器上不存在该文件时,可从保密代码数据库中进行查询并获取该源文件。
构建服务器获取源文件直接包含的头文件的信息,如图6B所示。然后,将所获取的直接包含的头文件的信息返回给本地构建端,如附图标记B2所示。
本地构建端从构建服务器获取源文件直接包含的头文件的信息,并对头文件进行编译依赖分析,从而获得该头文件直接和间接包含的所有头文件,如附图标记3和图6C所示。
在获取所有头文件之后,编译工具将包括所有头文件的构建要素发送至构建服务器,如附图标记B4所示。
在构建服务器收到由本地构建端发送的构建要素之后,建立编译环境与本地构建端的本地工作空间相同或同步的镜像工作空间。此时可以在镜像工作空间(构建服务器的编译工作空间)中对源文件进行编译,并得到编译结果,如附图标记B5所示。
然后,构建服务器将编译结果返回给本地构建端,例如,将包括目标文件数据流、编译警告错误等的编译结果返回给本地构建端,如附图标记B6所示。
基于以上可见,根据本发明的实施例的用于源代码分布式构建的方法可以实现源代码的分布构建。由于构建服务器采用与本地构建端本地同步的编译环境,所以对于例如C/C++代码,可以避免二进制兼容风险。此外,在构建服务器对诸如保密代码的源代码进行构建,可以确保源代码的安全性。
图7示出了根据本发明的示例性实施例的用于源代码分布式构建的装置的框图。该用于源代码分布式构建的装置可以应用于本地构建端中。
如图7中所示,根据本发明实施例的用于源代码分布式构建的装置700可以包括:构建单元710,进行源代码构建;查询单元720,当待构建源文件不可见时,向所述构建服务器进行关于所述待构建源文件的查询;同步单元730,向所述构建服务器同步工作空间;接收单元740,接收所述构建服务器返回的构建结果。
在本发明的一些实施例中,查询单元720可以用于:根据构建描述脚本中描述的版本信息和源文件路径信息向所述构建服务器进行查询。
在本发明的一些实施例中,同步单元730可以用于:从所述构建服务器接收所述待构建源文件的直接依赖项的信息;对所述直接依赖项进行编译依赖分析,获得所述待构建源文件的间接依赖项的信息;将构建要素发送至所述构建服务器,所述构建要素包括所述直接依赖项和所述间接依赖项。
在本发明的一些实施例中,该用于源代码分布式构建的装置还包括编译单元。编译单元在待构建源文件可见时,对所述待构建源文件进行编译。
图8示出了根据本发明的示例性实施例的用于源代码分布式构建的装置的框图。该用于源代码分布式构建的装置可以应用于服务器中。
如图8中所示,根据本发明实施例的用于源代码分布式构建的装置800可以包括:同步单元810,从本地构建端接收构建要素,且根据所述构建要素建立所述本地构建端的编译环境的镜像工作空间;构建单元820,在所述镜像工作空间构建待构建源文件并得到构建结果;结果返回单元830,所述构建服务器向所述本地构建端返回所述构建结果。
在本发明的一些实施例中,该用于源代码分布式构建的装置还可以包括:接收单元,配置为从本地构建端接收关于待构建源文件的构建查询信息;获取单元,配置为根据所述构建查询信息获取所述待构建源文件;分析单元,配置为获取所述待构建源文件的直接依赖项的信息;交互单元,配置为向所述本地构建端返回所述直接依赖项的信息,以使所述本地构建端对所述直接依赖项进行编译依赖分析而获得所述待构建源文件的间接依赖项的信息。
在本发明的一些实施例,该用于源代码分布式构建的装置还可以包括储存单元,将所述构建结果储存在缓存中。
在本发明的一些实施例中,该用于源代码分布式构建的装置还可以包括:访问单元,访问保密代码仓库;维护单元,维护所述待构建源文件的多个版本。
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本发明的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本发明实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、触控本地端、或者网络设备等)执行根据本发明实施方式的方法。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本发明未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由下面的权利要求指出。
应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明的范围仅由所附的权利要求来限制。
Claims (12)
1.一种用于源代码分布式构建的方法,其特征在于,所述方法所应用的系统架构包括本地构建端和构建服务器,所述方法包括:
在所述本地构建端开始源代码构建;
当待构建源文件不可见时,针对所述待构建源文件向所述构建服务器发起构建请求;
接收所述构建服务器返回的所述待构建源文件的直接依赖项的信息;
对所述直接依赖项进行编译依赖分析得到所述待构建源文件的间接依赖项的信息;
将包括所述待构建源文件的直接依赖项和间接依赖项的构建要素发送给所述构建服务器,以使所述构建服务器根据所述构建要素建立本地端的编译环境的镜像工作空间,并在所述镜像工作空间构建所述待构建源文件并得到构建结果;
所述本地构建端接收所述构建服务器返回的构建结果。
2.根据权利要求1所述的方法,其特征在于,所述针对所述待构建源文件向所述构建服务器发起构建请求包括:
根据构建描述脚本中描述的版本信息和源文件路径信息向所述构建服务器进行查询。
3.根据权利要求1所述的方法,其特征在于,所述直接依赖项和所述间接依赖项为头文件或接口文件。
4.根据权利要求1所述的方法,其特征在于,所述构建要素还包括:本地端源代码的目录结构、依赖项搜索路径、编译选项和编译器信息中的一个或更多个。
5.根据权利要求1所述的方法,其特征在于,所述待构建源文件为保密源代码文件。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在待构建源文件可见时,对所述待构建源文件进行编译。
7.根据权利要求1所述的方法,其特征在于,所述构建要素还包括本地端源代码的目录结构、依赖项搜索路径、编译选项和编译器信息中的一个或更多个。
8.根据权利要求7所述的方法,其特征在于,所述方法还包括:
从所述本地构建端接收关于所述待构建源文件的构建查询信息;
根据所述构建查询信息获取所述待构建源文件;
获取所述待构建源文件的直接依赖项的信息;
向所述本地构建端返回所述直接依赖项的信息,以使所述本地构建端对所述直接依赖项进行编译依赖分析而获得所述待构建源文件的间接依赖项的信息。
9.一种用于源代码分布式构建的装置,其特征在于,该装置所应用的系统架构包括本地构建端和构建服务器,所述装置包括:
构建单元,配置为在所述本地构建端进行源代码构建;
查询单元,配置为当待构建源文件不可见时,向所述构建服务器进行关于所述待构建源文件的查询;
同步单元,配置为接收所述构建服务器返回的所述待构建源文件的直接依赖项的信息;对所述直接依赖项进行编译依赖分析得到所述待构建源文件的间接依赖项的信息;将包括所述待构建源文件的直接依赖项和间接依赖项的构建要素发送给所述构建服务器,以使所述构建服务器根据所述构建要素建立本地端的编译环境的镜像工作空间,并在所述镜像工作空间构建所述待构建源文件并得到构建结果;
接收单元,配置为所述本地构建端接收所述构建服务器返回的构建结果。
10.根据权利要求9所述的装置,其特征在于,所述查询单元用于根据构建描述脚本中描述的版本信息和源文件路径信息向所述构建服务器进行查询。
11.根据权利要求9所述的装置,其特征在于,所述装置还包括编译单元,在待构建源文件可见时,对所述待构建源文件进行编译。
12.根据权利要求11所述的装置,其特征在于,所述装置还包括:接收单元,配置为从本地构建端接收关于待构建源文件的构建查询信息;获取单元,配置为根据所述构建查询信息获取所述待构建源文件;分析单元,配置为获取所述待构建源文件的直接依赖项的信息;交互单元,配置为向所述本地构建端返回所述直接依赖项的信息,以使所述本地构建端对所述直接依赖项进行编译依赖分析而获得所述待构建源文件的间接依赖项的信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810432162.0A CN110457040B (zh) | 2018-05-08 | 2018-05-08 | 用于源代码分布式构建的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810432162.0A CN110457040B (zh) | 2018-05-08 | 2018-05-08 | 用于源代码分布式构建的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110457040A CN110457040A (zh) | 2019-11-15 |
CN110457040B true CN110457040B (zh) | 2022-02-25 |
Family
ID=68480461
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810432162.0A Active CN110457040B (zh) | 2018-05-08 | 2018-05-08 | 用于源代码分布式构建的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110457040B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113127419B (zh) * | 2019-12-30 | 2023-09-22 | 腾讯科技(深圳)有限公司 | 文件检出方法、装置、计算机设备及存储介质 |
WO2022061235A1 (en) * | 2020-09-18 | 2022-03-24 | Earthly Technologies Inc. | System and method for a hybrid development platform |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101187965A (zh) * | 2006-11-16 | 2008-05-28 | 思科技术公司 | 过滤对数据对象的访问 |
CN103729184A (zh) * | 2013-12-29 | 2014-04-16 | 国云科技股份有限公司 | 一种软件组件组合构建方法 |
CN105824614A (zh) * | 2015-12-15 | 2016-08-03 | 广东亿迅科技有限公司 | 基于Docker的分布式开发环境的搭建方法及装置 |
CN106888254A (zh) * | 2017-01-20 | 2017-06-23 | 华南理工大学 | 一种基于Kubernetes的容器云架构及其各模块之间的交互方法 |
WO2017134665A1 (en) * | 2016-02-03 | 2017-08-10 | Cocycles | System for organizing, functionality indexing and constructing of a source code search engine and method thereof |
-
2018
- 2018-05-08 CN CN201810432162.0A patent/CN110457040B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101187965A (zh) * | 2006-11-16 | 2008-05-28 | 思科技术公司 | 过滤对数据对象的访问 |
CN103729184A (zh) * | 2013-12-29 | 2014-04-16 | 国云科技股份有限公司 | 一种软件组件组合构建方法 |
CN105824614A (zh) * | 2015-12-15 | 2016-08-03 | 广东亿迅科技有限公司 | 基于Docker的分布式开发环境的搭建方法及装置 |
WO2017134665A1 (en) * | 2016-02-03 | 2017-08-10 | Cocycles | System for organizing, functionality indexing and constructing of a source code search engine and method thereof |
CN106888254A (zh) * | 2017-01-20 | 2017-06-23 | 华南理工大学 | 一种基于Kubernetes的容器云架构及其各模块之间的交互方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110457040A (zh) | 2019-11-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111527488B (zh) | 基于区块链的数据同步的系统和方法 | |
US10628578B2 (en) | Systems and methods for determining trust levels for computing components using blockchain | |
US10515205B2 (en) | Systems and methods for determining trust levels for computing components | |
US10216490B2 (en) | Systems and methods for computing applications | |
CA2939379C (en) | Systems and methods for partitioning computing applications to optimize deployment resources | |
WO2018177260A1 (zh) | 一种应用程序开发方法及其工具、设备、存储介质 | |
CN112579097B (zh) | 软件项目构建方法、装置、存储介质及电子设备 | |
CN112104709B (zh) | 智能合约的处理方法、装置、介质及电子设备 | |
US9182949B2 (en) | Systems and methods for controlling branch latency within computing applications | |
US11226830B2 (en) | System for building, managing, deploying and executing reusable analytical solution modules for industry applications | |
CN110865889A (zh) | 组件间传递事件的方法和装置 | |
US10452369B2 (en) | Code profiling of executable library for pipeline parallelization | |
EP3502871B1 (en) | System and methods for determining trust levels for computing components using blockchain | |
CN110750243A (zh) | 项目代码开发方法和系统 | |
CN110457040B (zh) | 用于源代码分布式构建的方法和装置 | |
CN114816361A (zh) | 拼搭工程生成方法、装置、设备、介质和程序产品 | |
CN112835568A (zh) | 一种项目构建方法和装置 | |
CN116700745A (zh) | 基于容器云平台的应用部署方法、装置、电子设备和介质 | |
US11983090B2 (en) | Setting breakpoints for source code segments enclosed by macros | |
US20240329983A1 (en) | Development environment integrated with infrastructure cost estimation system | |
Inersjö et al. | MALTE: Multi-Access Live Text Editor | |
CN118092880A (zh) | 一种项目打包处理方法和装置 | |
CN115016827A (zh) | 部署java应用的方法、装置、电子设备和介质 | |
Palmer et al. | Eksten et al.(43) Pub. Date: Aug. 28, 2014 | |
Guide et al. | Pro Java Microservices with Quarkus and Kubernetes |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |