编译方法、装置及设备与流程

文档序号:13804542阅读:175来源:国知局
编译方法、装置及设备与流程

本发明涉及编译技术领域,具体而言,本发明涉及一种编译方法、装置及设备。



背景技术:

软件开发人员通常基于开放的完整的软件发布开发平台,例如obs(openbuildservice,开放的构建服务)平台,开发编译软件。软件发布开发平台提供了基础架构来创建软件发布包,它支持广泛的操作系统和硬件架构,同时也支持插件(add-ons)、应用镜像(applianceimages)或整个linux的发布包。

有的软件发布开发平台支持依赖编译,也就是说如果一个项目更新,则除了该项目被编译之外,依赖这个项目的所有项目都会被重新编译。依赖编译功能为项目的整体更新提供了强大的支持。

但是如果软件发布开发平台的依赖编译产生循环依赖,则会造成软件发布开发平台中的项目编译的死循环,使得基于软件发布开发平台的项目编译失败。

本发明的发明人发现,一方面,支持依赖编译的软件发布开发平台的维护者通常仅仅关心软件发布开发平台本身的运行和维护,并不对编译依赖进行去循环依赖的维护;另一方面,开发人员通常不关心项目在软件发布开发平台上的依赖关系是否存在循环依赖;常常出现因循环依赖造成整个项目的编译失败。

目前,支持依赖编译的软件发布开发平台对于循环触发编译这个缺陷没有有效的解决方法。



技术实现要素:

本发明针对现有方式的缺点,提出一种编译方法、装置及设备,用以解决现有技术存在软件发布开发平台容易产生循环编译的问题。

本发明的实施例根据第一个方面,提供了一种编译方法,包括:

接收到更新项目时,判断所述更新项目涉及的依赖关系中是否存在循环依赖;

当所述判断结果表明存在循环依赖时,从所述更新项目开始执行编译,将所述循环依赖涉及的至少一个非更新项目设置为不可编译;

检测到所述编译停止后,将所述不可编译的至少一个非更新项目设置为可编译,将所述更新项目设置为不可编译,使得编译继续执行。

本发明的实施例根据第二个方面,还提供了一种编译装置,包括:

循环依赖判断模块,用于接收到更新项目时,判断所述更新项目涉及的依赖关系中是否存在循环依赖;当所述判断结果表明存在循环依赖时,发送状态切换编译通知;

状态切换和编译模块,用于接收到所述状态切换编译通知后,从所述更新项目开始执行编译,将所述循环依赖涉及的至少一个非更新项目设置为不可编译;检测到所述编译停止后,将所述不可编译的至少一个非更新项目设置为可编译,将所述更新项目设置为不可编译,使得编译继续执行。

本发明的实施例根据第三个方面,还提供了一种编译设备,包括:

存储器;

处理器;

至少一个程序,存储于所述存储器中,被配置为由所述处理器执行时实现下述步骤:

接收到更新项目时,判断所述更新项目涉及的依赖关系中是否存在循环依赖;

当所述判断结果表明存在循环依赖时,从所述更新项目开始执行编译,将所述循环依赖涉及的至少一个非更新项目设置为不可编译;

检测到所述编译停止后,将所述不可编译的至少一个非更新项目设置为可编译,将所述更新项目设置为不可编译,使得编译继续执行。

本发明实施例中,当判断出更新项目涉及的依赖关系中存在循环依赖时,将循环依赖涉及的至少一个非更新项目设置为不可编译,并从更新项目开始执行编译;当检测到编译停止后,将不可编译的至少一个非更新项目设置为可编译,将更新项目设置为不可编译,使得编译执行。可见,本发明实施例中,通过对循环依赖关系涉及的更新项目和至少一个非更新项目在可编译状态与不可编译状态之间合理切换,将循环依赖关系拆分为两个阶段非循环的依赖关系,并根据两个阶段非循环的依赖关系分别进行对应的两个阶段项目编译,最终完成循环依赖关系涉及的所有项目的编译工作;从而可以在防止陷入循环编译的情况下,实现对循环依赖关系涉及项目的编译工作。

本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。

附图说明

本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:

图1为现有的基于循环依赖关系进行编译的一个特例的示意图;

图2为本发明实施例的编译方法的流程示意图;

图3为本发明实施例的基于循环依赖关系转换出非循环依赖关系进行编译的一个特例的示意图;

图4为本发明实施例的编译装置的内部结构的框架示意图;

图5为本发明实施例的编译设备的内部结构的框架示意图。

具体实施方式

下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。

本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。

本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。

本技术领域技术人员可以理解,这里所使用的“终端”、“终端设备”既包括无线信号接收器的设备,其仅具备无发射能力的无线信号接收器的设备,又包括接收和发射硬件的设备,其具有能够在双向通信链路上,进行双向通信的接收和发射硬件的设备。这种设备可以包括:蜂窝或其他通信设备,其具有单线路显示器或多线路显示器或没有多线路显示器的蜂窝或其他通信设备;pcs(personalcommunicationsservice,个人通信系统),其可以组合语音、数据处理、传真和/或数据通信能力;pda(personaldigitalassistant,个人数字助理),其可以包括射频接收器、寻呼机、互联网/内联网访问、网络浏览器、记事本、日历和/或gps(globalpositioningsystem,全球定位系统)接收器;常规膝上型和/或掌上型计算机或其他设备,其具有和/或包括射频接收器的常规膝上型和/或掌上型计算机或其他设备。这里所使用的“终端”、“终端设备”可以是便携式、可运输、安装在交通工具(航空、海运和/或陆地)中的,或者适合于和/或配置为在本地运行,和/或以分布形式,运行在地球和/或空间的任何其他位置运行。这里所使用的“终端”、“终端设备”还可以是通信终端、上网终端、音乐/视频播放终端,例如可以是pda、mid(mobileinternetdevice,移动互联网设备)和/或具有音乐/视频播放功能的移动电话,也可以是智能电视、机顶盒等设备。

本发明的发明人经过研究发现,目前obs等软件发布开发平台对于编译项目的依赖关系仅仅是简单的触发关系,不对这种触发关系可能产生的循环依赖进行任何的检测和处理。

例如,图1是现有的基于循环依赖关系进行编译的一个特例的示意图。图1中的循环依赖关系包括:项目a的编译依赖项目c,项目c的编译依赖项目b,项目b的编译依赖项目a。根据该循环依赖关系,当项目a被更新时编译项目a,项目a编译完成时软件发布开发平台就会自动触发项目b的编译。同理,当项目b被更新时编译项目b,项目b编译之后自动触发项目c的编译,再由项目c触发项目a的编译,这样造成了软件发布开发平台中项目a-c之间不停的循环编译。

本发明的发明人还发现,若通过软件发布开发平台的维护者手动检查维护项目编译的依赖关系、或开发人员的人工检查循环依赖,来尽量避免循环依赖的发生,则会给维护者或开发人员造成很大的额外工作量,造成时间成本大大增加。而且,即使维护者或者开发人员发现了循环依赖的存在,也无法避免基于循环依赖的循环编译,很可能导致在软件发布开发平台上一部分项目无法完成编译或者开发中的软件返工。

下面结合附图具体介绍本发明实施例的技术方案。

本发明实施例适用于软件发布开发平台,例如obs(openbuildservice,开放的构建服务)平台等。

本发明实施例中,某一项目的源码文件在被开发人员更新提交至软件发布开发平台后,自动触发软件发布开发平台的更新编译流程,因提交源码文件而被编译的项目为更新项目,非因提交源码文件而是因为依赖关系而被编译的项目为非更新项目。

例如图1中项目b依赖项目a,当项目a的源码文件被更新提交时,触发项目a的编译;当项目a正在被编译的时候并不会触发项目b的编译,这时项目a是更新项目,项目b是非更新项目。

本发明实施例提供了一种编译方法,该方法的流程示意图如图2所示,包括下述步骤:

s201:接收到更新项目时,判断更新项目涉及的依赖关系中是否存在循环依赖;当判断结果表明存在循环依赖时,执行步骤s202;当判断结果表明不存在循环依赖时,执行步骤s204。

较佳地,监测到某一项目的源码文件或用于更新的源码文件向软件发布开发平台发送的提交请求后,拦截该请求,将该项目作为更新项目,确定接收到更新项目。

确定出依赖于更新项目的所有项目;判断所有项目中是否存在更新项目;判断结果为所有项目中存在更新项目时,表明存在循环依赖;当判断结果表明存在循环依赖时,执行步骤s202。依赖于更新项目的所有项目中,除了更新项目之外的项目都为非更新项目。

较佳地,从软件发布开发平台中确定出依赖于更新项目的所有项目。对于依赖于更新项目的所有项目中的每个项目,判断该每个项目是否存在依赖项目;当判断出该每个项目存在依赖项目时,判断该依赖项目是否是更新项目;当判断出该依赖项目是更新项目时,表明存在循环依赖,即判断结果表明存在循环依赖,执行后续步骤s202。

当判断出该依赖项目不是更新项目时,继续对下一个依赖于更新项目的项目进行判断。

当判断出依赖于更新项目的项目不存在依赖项目时,判断出该项目为非更新项目,继续对下一个依赖于更新项目的项目进行判断。

当依赖于更新项目的每个项目都不存在依赖项目、或者虽然存在依赖项目但是依赖项目都为非更新项目时,确定基于该更新项目不存在循环依赖,即判断结果表明不存在循环依赖,执行后续步骤s204。

s202:从更新项目开始执行编译,将循环依赖涉及的至少一个非更新项目设置为不可编译。

较佳地,将更新项目的(更新的)源码文件向软件发布开发平台提交,使得软件发布开发平台从更新项目开始执行编译;将软件发布开发平台中循环依赖涉及的至少一个非更新项目设置为不可编译。进一步,将循环依赖涉及的至少一个非更新项目设置为不可编译,包括:对于依赖于更新项目的所有项目,将所有项目中除了更新项目之外的项目,都确定为非更新项目;将确定出的非更新项目中的至少一个非更新项目设置为不可编译。

例如,图3是本发明实施例的基于循环依赖关系转换出非循环依赖关系进行编译的一个特例的示意图。图3中项目a的编译依赖项目c,项目c的编译依赖项目b,项目b的编译依赖项目a。当对项目b的源码文件进行更新时,项目b为更新项目,项目a和c为非更新项目。可以对项目b的源码文件进行更新自动触发针对项目b的编译,将项目a设置为disable(表示不可编译)。

此种情况下,软件发布开发平台会对更新项目、和更新项目涉及的循环依赖涉及的默认可编译的非更新项目,都进行编译;而对循环依赖涉及的设置为不可编译的至少一个非更新项目不进行编译。例如,对图3中的更新项目b、和以更新项目b为依赖项目的项目c进行编译。

可以理解,由于编译过程相比于不可编译的设置步骤耗时长得多,因此即使更新项目的编译先开始,至少一个非更新项目的不可编译的设置后开始,也可以使得至少一个非更新项目的不可编译的设置先结束,更新项目的编译后结束。可以防止编译陷入循环依赖,使得基于非循环的依赖关系进行编译。

更优的,将更新项目的(更新的)的源码文件向软件发布开发平台提交,使得软件发布开发平台从更新项目开始执行编译;同时,将软件发布开发平台中循环依赖涉及的至少一个非更新项目设置为不可编译。

可以理解,由于编译过程相比于不可编译的设置步骤耗时长得多,更新项目的编译、与至少一个非更新项目的不可编译的设置同时开始,可以保证至少一个非更新项目的不可编译的设置先结束,更新项目的编译后结束。

例如,可以在对图3中项目b的源码文件进行更新自动触发针对项目b的编译的同时,将项目a设置为disable(表示不可编译)。

进一步,将循环依赖涉及的至少一个非更新项目设置为不可编译后,从更新项目开始执行编译。可以进一步防止编译陷入循环依赖,保证基于非循环的依赖关系进行编译。

例如,可以将图3中的项目a设置为disable(表示不可编译)之后,然后对项目b的源码文件进行更新,以触发针对项目b的编译。

s203:检测到编译停止后,将不可编译的至少一个非更新项目设置为可编译,将更新项目设置为不可编译,使得编译继续执行。

根据上述步骤,更新项目、和更新项目涉及的循环依赖所涉及的默认为可编译的非更新项目,都被软件发布开发平台自动编译完毕;而遇到更新项目涉及的循环依赖所涉及的被设置为不可编译的非更新项目时,编译停止,被设置为不可编译的非更新项目都未被编译。

本步骤中,检测到编译停止后,将软件发布开发平台中不可编译的至少一个非更新项目设置为可编译,将更新项目设置为不可编译,使得编译继续执行。

一方面,当软件发布开发平台检测到原(上述步骤中)不可编译的至少一个非更新项目设置为可编译时,自动执行对该至少一个非更新项目的编译;另一方面,当软件发布开发平台检测到原(上述步骤中)可编译的更新项目设置为不可编译时,不对更新项目进行编译;从而完成对至少一个非更新项目的编译。

例如,将图3中更新项目b涉及的循环依赖所涉及的非更新项目a,将更新项目b从able(可编译)设置为disable(不可编译),使得软件发布开发平台对非更新项目a进行编译,而不对更新项目b进行编译。

至此,通过合理地设置更新项目和至少一个非更新项目的可编译和/或不可编译,将原循环依赖关系拆分为两个以上非循环依赖关系,使得原循环依赖的项目得以完成编译。

可以理解,由于编译过程相比于不可编译和可编译的设置步骤耗时长得多,因此即使至少一个非更新项目的编译先开始,更新项目的不可编译的设置后开始(或者同时开始),也可以使得更新项目的不可编译的设置先结束,至少一个非更新项目的编译后结束。可以防止编译陷入循环依赖,使得基于非循环的依赖关系进行编译。

较佳地,将不可编译的至少一个非更新项目设置为可编译后,将更新项目设置为不可编译。

例如,例如,将图3中更新项目b从able(可编译)设置为disable(不可编译)后,再将非更新项目a从disable(不可编译)设置为able(可编译),进一步保证使得软件发布开发平台对非更新项目a进行编译,而不对更新项目b进行编译。

s204:执行正常编译。

根据上述步骤可知,更新项目涉及的依赖关系中不存在循环依赖关系,因此,在本步骤中,对于更新项目涉及的依赖关系所涉及的所有项目,保持所有项目处于可编译的状态,对更新项目及其依赖关系所涉及的所有项目进行编译。

基于上述编译方法,本发明实施例还提供了一种编译装置,该编译装置的内部结构的框架示意图如图4所示,包括:循环依赖判断模块401和状态切换和编译模块402。

循环依赖判断模块401用于接收到更新项目时,判断更新项目涉及的依赖关系中是否存在循环依赖;当判断结果表明存在循环依赖时,发送状态切换编译通知。

状态切换和编译模块402用于接收到状态切换编译通知后,从更新项目开始执行编译,将循环依赖涉及的至少一个非更新项目设置为不可编译;检测到编译停止后,将不可编译的至少一个非更新项目设置为可编译,将更新项目设置为不可编译,使得编译继续执行。

较佳地,循环依赖判断模块401具体用于确定出依赖于更新项目的所有项目;判断所有项目中是否存在更新项目;当判断结果为所有项目中存在更新项目时,表明存在循环依赖,发送状态切换编译通知。

较佳地,循环依赖判断模块401具体用于对于依赖于更新项目的每个项目,判断该每个项目是否存在依赖项目;当判断出该每个项目存在依赖项目时,判断该依赖项目是否是更新项目。

较佳地,状态切换和编译模块402具体用于将循环依赖涉及的至少一个非更新项目设置为不可编译后,从更新项目开始执行编译。

较佳地,状态切换和编译模块402具体用于对于依赖于更新项目的所有项目,将所有项目中除了更新项目之外的项目,都确定为非更新项目;将确定出的非更新项目中的至少一个非更新项目设置为不可编译。

较佳地,状态切换和编译模块402具体用于将不可编译的至少一个非更新项目设置为可编译后,将更新项目设置为不可编译。

上述循环依赖判断模块401和状态切换和编译模块402功能的具体实现方法,可以上述如图2所示的流程步骤的具体内容,此处不再赘述。

更优的,本发明实施例还提供一种编译设备,该编译设备的内部结构的框架示意图如图5所示,包括:存储器501和处理器502。

存储器501与处理器502相电连接。

至少一个程序,存储于存储器501中,被配置为由处理器502执行时实现下述步骤:接收到更新项目时,判断更新项目涉及的依赖关系中是否存在循环依赖;当判断结果表明存在循环依赖时,从更新项目开始执行编译,将循环依赖涉及的至少一个非更新项目设置为不可编译;检测到编译停止后,将不可编译的至少一个非更新项目设置为可编译,将更新项目设置为不可编译,使得编译继续执行。

较佳地,至少一个程序在实现判断更新项目涉及的依赖关系中是否存在循环依赖的步骤过程中,具体实现下述步骤:确定出依赖于更新项目的所有项目;判断所有项目中是否存在更新项目。

较佳地,至少一个程序在实现判断所有项目中是否存在更新项目的步骤过程中,具体实现下述步骤:对于依赖于更新项目的每个项目,判断该每个项目是否存在依赖项目;当判断出该每个项目存在依赖项目时,判断该依赖项目是否是更新项目。

较佳地,至少一个程序在实现从更新项目开始执行编译,将循环依赖涉及的至少一个非更新项目设置为不可编译的步骤过程中,具体实现下述步骤:将循环依赖涉及的至少一个非更新项目设置为不可编译后,从更新项目开始执行编译。

较佳地,至少一个程序在实现将循环依赖涉及的至少一个非更新项目设置为不可编译的步骤过程中,具体实现下述步骤:对于依赖于更新项目的所有项目,将所有项目中除了更新项目之外的项目,都确定为非更新项目;将确定出的非更新项目中的至少一个非更新项目设置为不可编译。

较佳地,至少一个程序在实现将不可编译的至少一个非更新项目设置为可编译,将更新项目设置为不可编译的步骤过程中,具体实现下述步骤:将不可编译的至少一个非更新项目设置为可编译后,将更新项目设置为不可编译。

本发明实施例中,当判断出更新项目涉及的依赖关系中存在循环依赖时,将循环依赖涉及的至少一个非更新项目设置为不可编译,并从更新项目开始执行编译;当检测到编译停止后,将不可编译的至少一个非更新项目设置为可编译,将更新项目设置为不可编译,使得编译执行。可见,本发明实施例中,通过对循环依赖关系涉及的更新项目和至少一个非更新项目在可编译状态与不可编译状态之间合理切换,将循环依赖关系拆分为两个阶段非循环的依赖关系,并根据两个阶段非循环的依赖关系分别进行对应的两个阶段项目编译,最终完成循环依赖关系涉及的所有项目的编译工作;从而可以在防止陷入循环编译的情况下,实现对循环依赖关系涉及项目的编译工作。

而且,本发明实施例中,不需要对编译项目的软件发布开发平台作任何改变;也就是说,本发明实施例适用于相当多的软件发布开发平台的项目编译工作,适用范围较广,适用成本低廉。

进一步,本发明实施例中,可以确定出依赖于更新项目的所有项目,当判断出上述所有项目中存在更新项目时,表明存在循环依赖。可见,本发明实施例中,对项目实行遍历式判断,不会发生项目判断的遗漏,使得判断较为可靠;而且,判断方法较为简单快速,效率较高。

本技术领域技术人员可以理解,本发明包括涉及用于执行本申请中所述操作中的一项或多项的设备。这些设备可以为所需的目的而专门设计和制造,或者也可以包括通用计算机中的已知设备。这些设备具有存储在其内的计算机程序,这些计算机程序选择性地激活或重构。这样的计算机程序可以被存储在设备(例如,计算机)可读介质中或者存储在适于存储电子指令并分别耦联到总线的任何类型的介质中,所述计算机可读介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、cd-rom、和磁光盘)、rom(read-onlymemory,只读存储器)、ram(randomaccessmemory,随即存储器)、eprom(erasableprogrammableread-onlymemory,可擦写可编程只读存储器)、eeprom(electricallyerasableprogrammableread-onlymemory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,可读介质包括由设备(例如,计算机)以能够读的形式存储或传输信息的任何介质。

本技术领域技术人员可以理解,可以用计算机程序指令来实现这些结构图和/或框图和/或流图中的每个框以及这些结构图和/或框图和/或流图中的框的组合。本技术领域技术人员可以理解,可以将这些计算机程序指令提供给通用计算机、专业计算机或其他可编程数据处理方法的处理器来实现,从而通过计算机或其他可编程数据处理方法的处理器来执行本发明公开的结构图和/或框图和/或流图的框或多个框中指定的方案。

本技术领域技术人员可以理解,本发明中已经讨论过的各种操作、方法、流程中的步骤、措施、方案可以被交替、更改、组合或删除。进一步地,具有本发明中已经讨论过的各种操作、方法、流程中的其他步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。进一步地,现有技术中的具有与本发明中公开的各种操作、方法、流程中的步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。

以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1