本申请实施例涉及计算机软件开发的技术领域,特别是涉及一种持续集成系统的产品交付方法及装置、电子设备。
背景技术:
持续集成是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。这一过程可以大大减少集成出现的问题,使开发团队能够更快的开发内聚的软件程序。
持续集成系统根据用户制定的编译策略,构建编译任务,从代码仓库中拉取代码进行编译,将编译后的代码进行打包形成程序包,并将所述程序包上传至制品库中。在传统的技术中,持续集成系统构建完毕程序包,并上传制品库失败时,被视为程序包构建失败,需要重新进行构建编译任务,增加了开发人员的工作量,造成时间资源的浪费,导致程序开发效率低下。
技术实现要素:
本申请实施例提供了一种持续集成系统的产品交付方法及装置、电子设备,在所述制品库处于维护状态、或断线等状态导致持续集成系统与所述制品库之间的连接中断,将程序包上传至制品库失败时,开发人员不需要重新进行构建编译任务,减少了工作量,节省了时间资源,提高了软件程序的开发效率。
第一方面,本申请实施例提供了一种持续集成系统的产品交付方法,所述方法包括:
获取持续集成系统所构建的程序包的交付状态,所述交付状态用于指示所述程序包是否被成功上传至制品库;
当所述交付状态指示所述程序包未能成功上传至所述制品库,将所述程序包上传至备份服务器;
当满足预设触发条件,将所述程序包从所述备份服务器中上传至所述制品库。
可选的,所述将所述程序包上传至备份服务器,包括:
获取所述程序包的属性信息以及不同属性信息之间的层级关系;
根据所述层级关系,生成第一存储路径,并根据每个所述属性信息生成所述第一存储路径中,对应层级的文件目录名称;
将所述程序包上传至所述备份服务器中的第一存储路径。
可选的,所述属性信息包括以下至少一项:
客户名称、产品型号、程序版本、代码分支。
可选的,所述将所述程序包从所述备份服务器中上传至所述制品库,还包括:
对所述备份服务器的文件目录进行递归检测,得到第一存储路径;
解析所述第一存储路径,得到所述第一存储路径中每个层级的文件目录名称;
根据所述每个层级的文件目录名称,得到第二存储路径;
将所述程序包从所述第一存储路径上传至所述制品库中的所述第二存储路径。
可选的,确认是否满足触发条件的步骤包括:
确认预设的定时任务是否启动。
可选的,当所述交付状态指示所述程序包成功上传至所述制品库,所述方法还包括:
生成下载连接,所述下载连接用于从所述制品库中获取所述程序包。
可选的,所述备份服务器为ftp服务器。
可选的,所述ftp服务器配置于docker容器中。
第二方面,本申请实施例提供了一种持续集成系统的产品交付装置,所述装置包括:
交付状态获取模块,用于获取持续集成系统所构建的程序包的交付状态,所述交付状态用于指示所述程序包是否被成功上传至制品库;
备份模块,用于当所述交付状态指示所述程序包未能成功上传至所述制品库,将所述程序包上传至备份服务器;
回传模块,用于当满足预设触发条件,将所述程序包从所述备份服务器中上传至所述制品库。
第三方面,本申请实施例提供了一种电子设备,包括:
至少一个存储器以及至少一个处理器;
所述存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述至少一个处理器执行,使得所述至少一个处理器实现如本申请实施例第一方面所述的持续集成系统的产品交付方法的步骤。
第四方面,本申请实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如本申请实施例第一方面所述的持续集成系统的产品交付方法的步骤。
在本申请实施例中,通过设置备份服务器,当检测到持续集成系统未能成功的将构建的程序包上传至制品库时,将程序包转存至备份服务器中,并在满足触发条件时,自动将程序包从备份服务器上传至制品库中,从而在所述制品库处于维护状态、或断线等状态导致持续集成系统与所述制品库之间的连接中断,将程序包上传至制品库失败时,将程序包存入备份服务器,并自动回传至制品库,开发人员不需要重新进行构建编译任务,减少了工作量,节省了时间资源,提高了软件程序的开发效率。
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
附图说明
图1为传统技术中持续集成系统的程序开发场景示意图;
图2为在一个示例性的实施例中提供的一种持续集成系统的产品交付方法的流程图;
图3为在一个示例性的实施例中提供的备份服务器的示意图;
图4为在一个示例性的实施例中提供的将程序包上传至备份服务器的流程图;
图5为在一个示例性的实施例中提供的将程序包上传至备份服务器的流程图;
图6为在一个示例性的实施例中提供的配置ftp服务器的流程图;
图7为在一个示例性的实施例中提供的一种持续集成系统的产品交付方法的流程图;
图8为在一个示例性的实施例中提供的一种持续集成系统的产品交付装置的结构示意图;
图9为在一个示例性的实施例中提供的一种电子设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施例方式作进一步地详细描述。
应当明确,所描述的实施例仅仅是本申请实施例一部分实施例,而不是全部的实施例。基于本申请实施例中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本申请实施例保护的范围。
在本申请实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请实施例。在本申请实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。在本申请的描述中,需要理解的是,术语“第一”、“第二”、“第三”等仅用于区别类似的对象,而不必用于描述特定的顺序或先后次序,也不能理解为指示或暗示相对重要性。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本申请中的具体含义。
此外,在本申请的描述中,除非另有说明,“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
如图1所示,图1为传统技术一个例子中的持续集成系统的程序开发场景示意图。在图1中,开发人员通过计算机100连接远程服务器200,其中,远程服务器200中运行有持续集成系统,所述持续集成系统用于将源代码编译为可执行文件,以及将各个分别开发的模块集合为一个完整的系统,在本申请实施例中,所述持续集成系统可以是jenkins平台。
开发人员通过计算机100连接到远程服务器200中运行的持续集成系统后,可以在持续集成系统中制定编译策略,构建编译任务,以及从代码仓库中拉取代码进行编译,将编译后的代码进行打包形成程序包后,将程序包上传至制品库300。其中,制品库300可以是专有的服务器,在其他例子中,制品库也可以是远程服务器200中的部分存储空间。
持续集成系统将程序包成功上传至制品库300后,返回一个下载链接,开发人员可以通过该下载链接从制品库中下载该程序包。在远程服务器200与制品库300之间的网络连接不稳定,或制品库300处于开发维护状态等状态时,持续集成系统将程序包上传至制品库300的过程可能会失败。但在传统技术中,持续集成系统将程序包上传至制品库300失败后,开发人员需要重新构建编译任务,重新编译代码生成程序包,造成时间资源的浪费。
为了解决这一技术问题,本申请实施例提供了一种持续集成系统的产品交付方法,如图2所示,在一个示例性的实施例中,所述方法包括如下步骤:
s201:获取持续集成系统所构建的程序包的交付状态,所述交付状态用于指示所述程序包是否被成功上传至制品库。
所述程序包为所述持续集成系统所构建出的软件产品,对于一般的持续集成系统而言,程序包的生产过程通常包括源码获取,源码检查,源码编译,测试,部署等步骤。
所述持续集成系统用于将源代码编译为可执行文件,即程序包,并将各个分别开发的模块集合为一个完整的系统,所述持续集成系统通常包括如下功能模块:
版本检查模块:用于获取代码和其他必要的文件。
源码检查模块:对于源代码的静态分析,检查可能存在的错误。
源码编译模块:通过编译器和连接器编译源文件,生产可执行文件或库。
测试模块:通过对编译出来的程序包进行一定测试,并获得测试结果。
部署模块:若测试通过,则将程序包作为最终得到的产物交付上传至制品库。
在本申请实施例中,增加了对所述持续集成系统将构建完成的程序包上传至制品库的检测,如果上传失败,则所述交付状态指示持续集成系统未能将构建的程序包成功上传至制品库。
在一些例子中,如果检测到持续集成系统成功的将构建的程序包成功上传至制品库,所述持续集成系统还可以生成用于从制品库下载该程序包的下载链接。
在一些例子中,实现对所述交付状态的检测功能,可以是通过在所述持续集成系统构建的中间脚本文件中实现。
s202:当所述交付状态指示所述程序包未能成功上传至所述制品库,将所述程序包上传至备份服务器。
所述制品库为用于保存所述持续集成系统每次构建的结果的服务器,在本申请实施例中,在程序包上传至制品库失败后,所述持续集成系统将所述程序包上传至提前部署好的备份服务器中保存。在一个例子中,所述制品库为jfrog二进制软件制品仓库。
所述备份服务器用于暂时性的存储所述程序包,所述备份服务器可以是所述持续集成系统所在的远程服务器中的部分存储空间,或者是云服务器,在一些例子中,如图3所示,所述备份服务器400还可以是单独的一台计算机设备,持续集成系统所在的远程服务器200与该备份服务器400连接。
在一个优选的例子中,所述备份服务器为ftp(filetransferprotocol,文件传输协议)服务器,ftp协议是一种基于tcp的协议,采用客户/服务器模式,用于在两台计算机之间传输文件。通过ftp协议,用户可以在ftp服务器中进行文件的上传或下载等操作。
在一些例子中,将所述程序包上传至备份服务器后,所述持续集成系统还可以根据所述程序包在备份服务器中的存储地址,生成用于从备份服务器中下载所述程序包的下载链接。
s203:当满足预设触发条件,将所述程序包从所述备份服务器中上传至所述制品库。
在本申请实施例中,在预设的触发条件满足时,还自动将暂存于所述备份服务器中的程序包上传至所述制品库。其中,可以是定时的将所述备份服务器中的程序包上传至所述制品库,即所述预设触发条件为定时触发,所述定时触发可以通过在所述持续集成系统中构建定时任务实现。在其他例子中,所述预设触发条件还可以是用户手动触发。
在一些例子中,所述持续集成系统还检测其所在的远程服务器与所述制品库的连接关系,当检测到连接关系正常时,即满足预设触发条件,将将所述程序包从所述备份服务器中上传至所述制品库。
其中,可以通过所述持续集成系统将所述程序包从所述备份服务器中上传至所述制品库,还可以是在备份服务器中设置触发条件,由备份服务器自动将所述程序包从所述备份服务器中上传至所述制品库。
在本申请实施例中,通过设置备份服务器,当检测到持续集成系统未能成功的将构建的程序包上传至制品库时,将程序包转存至备份服务器中,并在满足触发条件时,自动将程序包从备份服务器上传至制品库中,从而在所述制品库处于维护状态、或断线等状态导致持续集成系统与所述制品库之间的连接中断,将程序包上传至制品库失败时,将程序包存入备份服务器,并自动回传至制品库,开发人员不需要重新进行构建编译任务,减少了工作量,节省了时间资源,提高了软件程序的开发效率。
在一个实施例中,如图4所示,所述将所述程序包上传至备份服务器,具体包括如下步骤:
s401:获取所述程序包的属性信息以及不同属性信息之间的层级关系。
s402:根据所述层级关系,生成第一存储路径,并根据每个所述属性信息生成所述第一存储路径中,对应层级的文件目录名称,所述第一存储路径指示所述程序包在所述备份服务器中的存储地址。
s403:将所述程序包上传至所述备份服务器中的第一存储路径。
为方便的保存和识别所述持续集成系统每次构建的不同程序包,在本申请实施例中,还根据每个程序包的属性信息,以及不同属性信息之间的层级,来构建每个程序包的存储路径,并根据确定的存储路径对每个程序包进行存储。
所述程序包的属性信息用于区分所述程序包与其他程序包,在一个例子中,所述属性信息包括以下至少一项所述程序包的属性:客户名称、产品型号、程序版本、代码分支。通过所述属性信息,可以很方便的识别所述程序包。
所述层级关系为预先设置的不同属性信息之间的对应关系,通常高层级的属性信息可以对应一个或多个低层级的属性信息,例如,客户名称作为高层及的属性信息,可以对应一个或多个产品型号。
所述第一存储路径为符合所述备份服务器的存储规则的存储路径,在本申请实施例中,首先识别出所述程序包的属性信息以及不同属性信息之间的层级关系,再根据每个所述属性信息生成所述第一存储路径中,对应层级的文件目录名称,即根据程序包的属性信息的层级和名称确定所述第一存储路径中的文件目录的层级以及名称,再与所述备份服务器的路径标识相结合,生成第一存储路径。
在一些例子中,当所述备份服务器不存在该第一存储路径时,则在所述备份服务器中创建该第一存储路径。
在一个具体的例子中,当所述备份服务器为ftp服务器,所述程序包的属性信息包括客户名称aa1、产品型号bb2、程序版本cc3、代码分支dd4,且上述属性信息的层级依次降低时,则根据上述属性信息和层级关系所生成的第一存储路径可以是:
ftp://aa1/bb2/cc3/dd4。
在其他例子中,所述第一存储路径还可以是由所述程序包的属性信息与其他参数组合形成。
在一个实施例中,如图5所示,所述将所述程序包从所述备份服务器中上传至所述制品库,包括:
s501:对所述备份服务器的文件目录进行递归检测,得到第一存储路径。
s502:解析所述第一存储路径,得到所述第一存储路径中每个层级的文件目录名称。
s503:根据所述每个层级的文件目录名称,得到第二存储路径,所述第二存储路径指示所述程序包在所述制品库中的存储地址。
s504:将所述程序包从所述第一存储路径上传至所述制品库中的所述第二存储路径。
为方便的保存和识别所述持续集成系统每次构建的不同程序包,在本申请实施例中,在将所述程序包由备份服务器上传至所述制品库时,也根据每个程序包的属性信息,以及不同属性信息之间的层级,来构建每个程序包的存储路径,并根据确定的存储路径对每个程序包进行存储。
在本申请实施例中,首先对所述备份服务器进行递归检测,即对所述备份服务器中的存储目录进行分层级的扫描检测,以确定每个存储目录是否存在程序包。当检测到第一存储路径存在程序包时,对第一存储路径进行解析,得到所述第一存储路径中每个层级的文件目录名称,继而根据所述第一存储路径中每个层级的文件目录名称以及每个文件目录的层级关系,确定所述第二存储路径中的文件目录的层级以及名称,再与所述制品库的路径标识相结合,生成第二存储路径。对应于上述实施例中的第一存储路径,所述第二存储路径可以是:http://aa1/bb2/cc3/dd4。
在一些例子中,当所述制品库不存在该第二存储路径时,则在所述备份服务器中创建该第二存储路径。
在其他例子中,所述第二存储路径还可以是由所述程序包的属性信息与其他参数组合形成。
在本申请实施例中,将所述程序包从所述备份服务器中上传至所述制品库的上述操作,可以由持续集成系统所运行的远程服务器执行,也可以由ftp服务器所运行的服务器主机来执行。
在一个实施例中,使用docker容器在linux服务器主机配置ftp服务器,从而可以将ftp服务器移植不同平台和操作系统。如图6所示,ftp服务器的配置过程包括如下步骤:
s601:在linux服务器主机上安装docker和docker-compose工具,并修改vsftpd的配置文件。
s602:基于docker-vsftpd镜像,编写dockerfile,拷贝配置文件至新镜像中,并暴露20/22/30000:30050端口。
s603:编写docker-compose模板文件,用于编排式启动新镜像的ftp容器,映射ftp容器8080端口与linux服务器主机的8080端口,并指定ftp容器中需要挂载的程序包存储路径。
s604:启动ftp容器,与所述持续集成系统建立连接。
如图7所示,在一个具体的例子中,持续集成系统的产品交付方法包括如下步骤:
s701:获取持续集成系统所构建的程序包的交付状态,如果所述交付状态指示所述程序包被成功上传至制品库,则执行步骤s702,否则执行步骤s703。
s702:生成用于从制品库中下载所述程序包的下载链接。
s703:获取所述程序包的属性信息以及不同属性信息之间的层级关系,根据所述层级关系,生成第一存储路径,并根据每个所述属性信息生成所述第一存储路径中,对应层级的文件目录名称。
s704:将所述程序包上传至所述备份服务器中的第一存储路径。
s705:当定时触发条件满足时,对所述备份服务器的文件目录进行递归检测,得到第一存储路径。
s706:解析所述第一存储路径,得到所述第一存储路径中每个层级的文件目录名称,根据所述每个层级的文件目录名称,得到第二存储路径,所述第二存储路径指示所述程序包在所述制品库中的存储地址。
s707:将所述程序包从所述第一存储路径上传至所述制品库中的所述第二存储路径。
与前述持续集成系统的产品交付方法相对应,本申请实施例还提供一种持续集成系统的产品交付装置,通过设置备份服务器,当检测到持续集成系统未能成功的将构建的程序包上传至制品库时,将程序包转存至备份服务器中,并在满足触发条件时,自动将程序包从备份服务器上传至制品库中,从而在所述制品库处于维护状态、或断线等状态导致持续集成系统与所述制品库之间的连接中断,将程序包上传至制品库失败时,将程序包存入备份服务器,并自动回传至制品库,开发人员不需要重新进行构建编译任务,减少了工作量,节省了时间资源,提高了软件程序的开发效率。
图8为本申请实施例提供的一种持续集成系统的产品交付装置的结构示意图,如图8所示,所述持续集成系统的产品交付装置800包括:
交付状态获取模块801,用于获取持续集成系统所构建的程序包的交付状态,所述交付状态用于指示所述程序包是否被成功上传至制品库;
备份模块802,用于当所述交付状态指示所述程序包未能成功上传至所述制品库,将所述程序包上传至备份服务器;
回传模块803,用于当满足预设触发条件,将所述程序包从所述备份服务器中上传至所述制品库。
在一个示例性的实施例中,所述回传模块803包括:
属性信息获取单元,用于获取所述程序包的属性信息以及不同属性信息之间的层级关系;
第一路径生成单元,用于根据所述层级关系,生成第一存储路径,并根据每个所述属性信息生成所述第一存储路径中,对应层级的文件目录名称;
第一上传单元,将所述程序包上传至所述备份服务器中的第一存储路径。
在一个示例性的实施例中,所述属性信息包括以下至少一项:
客户名称、产品型号、程序版本、代码分支。
在一个示例性的实施例中,所述回传模块803还包括:
路径检测单元,用于对所述备份服务器的文件目录进行递归检测,得到第一存储路径;
路径解析单元,用于解析所述第一存储路径,得到所述第一存储路径中每个层级的文件目录名称;
第二路径生成单元,用于根据所述每个层级的文件目录名称,得到第二存储路径;
第二上传单元,用于将所述程序包从所述第一存储路径上传至所述制品库中的所述第二存储路径。
在一个示例性的实施例中,所述回传模块803包括:
定时确认单元,用于确认预设的定时任务是否启动。
在一个示例性的实施例中,所述回传模块803包括:
下载链接生成单元,用于生成下载连接,所述下载连接用于从所述制品库中获取所述程序包。
在一个示例性的实施例中,所述备份服务器为ftp服务器。
在一个示例性的实施例中,所述ftp服务器配置于docker容器中。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
与前述持续集成系统的产品交付方法相对应,本申请实施例还提供一种电子设备,所述智能设备可以是计算机或服务器等电脑设备。
如图9所示,图9是本申请实施例根据一示例性实施例示出的一种电子设备的结构框图。
所述电子设备900包括处理器910和存储器920。该主控芯片中处理器910的数量可以是一个或者多个,图9中以一个处理器910为例。该主控芯片中存储器920的数量可以是一个或者多个,图9中以一个存储器920为例。
存储器920作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本申请实施例任意实施例所述的持续集成系统的产品交付方法程序,以及本申请实施例任意实施例所述的持续集成系统的产品交付方法对应的程序指令/模块(例如,交付状态获取模块801、备份模块802和回传模块803等)。存储器920可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据设备的使用所创建的数据等。此外,存储器920可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器920可进一步包括相对于处理器910远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
处理器910通过运行存储在存储器920中的软件程序、指令以及模块,从而执行设备的各种功能应用以及数据处理,即实现上述任一实施例所记载的持续集成系统的产品交付方法。
具体的,在一个示例性的实施例中,处理器910执行存储器920中存储的一个或多个程序时,具体实现如下操作:
获取持续集成系统所构建的程序包的交付状态,所述交付状态用于指示所述程序包是否被成功上传至制品库;
当所述交付状态指示所述程序包未能成功上传至所述制品库,将所述程序包上传至备份服务器;
当满足预设触发条件,将所述程序包从所述备份服务器中上传至所述制品库。
在上述实施例的基础上,所述将所述程序包上传至备份服务器,包括:
获取所述程序包的属性信息以及不同属性信息之间的层级关系;
根据所述层级关系,生成第一存储路径,并根据每个所述属性信息生成所述第一存储路径中,对应层级的文件目录名称;
将所述程序包上传至所述备份服务器中的第一存储路径。
在上述实施例的基础上,所述属性信息包括以下至少一项:
客户名称、产品型号、程序版本、代码分支。
在上述实施例的基础上,所述将所述程序包从所述备份服务器中上传至所述制品库,还包括:
对所述备份服务器的文件目录进行递归检测,得到第一存储路径;
解析所述第一存储路径,得到所述第一存储路径中每个层级的文件目录名称;
根据所述每个层级的文件目录名称,得到第二存储路径;
将所述程序包从所述第一存储路径上传至所述制品库中的所述第二存储路径。
在上述实施例的基础上,确认是否满足触发条件的步骤包括:
确认预设的定时任务是否启动。
在上述实施例的基础上,当所述交付状态指示所述程序包成功上传至所述制品库,所述方法还包括:
生成下载连接,所述下载连接用于从所述制品库中获取所述程序包。
在上述实施例的基础上,所述备份服务器为ftp服务器。
在上述实施例的基础上,所述ftp服务器配置于docker容器中。
本申请实施例还提供了一种计算机可读存储介质,其上储存有计算机程序,该计算机程序被处理器执行时实现上述任意一个实施例所述的持续集成系统的产品交付方法。
本发明可采用在一个或多个其中包含有程序代码的存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。计算机可读储存介质包括永久性和非永久性、可移动和非可移动媒体,可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其它数据。计算机的存储介质的例子包括但不限于:相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其它类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其它内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其它光学存储、磁盒式磁带,磁带磁磁盘存储或其它磁性存储设备或任何其它非传输介质,可用于存储可以被计算设备访问的信息。
应当理解的是,本申请实施例并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请实施例的范围仅由所附的权利要求来限制。
以上所述实施例仅表达了本申请实施例的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请实施例构思的前提下,还可以做出若干变形和改进,这些都属于本申请实施例的保护范围。