发明内容
本公开实施例至少提供一种依赖处理方法及装置。
第一方面,本公开实施例提供了一种依赖处理方法,包括:
获取待安装依赖的目标项目的基本描述文件及依赖描述文件;
基于所述基本描述文件及所述依赖描述文件,确定所述目标项目对应的依赖文件的唯一标识信息;
从本地缓存中搜索与所述唯一标识信息匹配的依赖文件,将从所述本地缓存中搜索得到的依赖文件作为所述目标项目的依赖文件,并安装搜索得到的所述依赖文件。
一种可选的实施方式中,所述方法还包括:
当所述本地缓存中不存在与所述唯一标识信息匹配的依赖文件时,向服务器请求与所述唯一标识信息匹配的依赖文件;
将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并安装所述服务器反馈的与所述唯一标识信息匹配的依赖文件。
一种可选的实施方式中,所述方法还包括:
当所述服务器中不存在与所述唯一标识信息匹配的依赖文件时,向依赖数据库请求所述目标项目对应的依赖文件;
将所述依赖数据库反馈的依赖文件作为与所述唯一标识信息关联的依赖文件存储至所述本地缓存,并安装所述依赖数据库反馈的依赖文件。
一种可选的实施方式中,将所述依赖数据库反馈的依赖文件作为与所述唯一标识信息关联的依赖文件存储至所述本地缓存之后,所述方法还包括:
将与所述唯一标识信息关联的依赖文件上传至所述服务器。
一种可选的实施方式中,所述目标项目包含多个子目标项目;所述基本描述文件包括主基本描述文件及多个子基本描述文件;
所述基于所述基本描述文件及所述依赖描述文件,确定所述目标项目对应的依赖文件的唯一标识信息,包括:
确定所述主基本描述文件及所述多个子基本描述文件中依赖描述字段的第一哈希值;
确定所述依赖描述文件的第二哈希值;
基于所述第一哈希值及所述第二哈希值,确定所述唯一标识信息。
一种可选的实施方式中,所述基于所述第一哈希值及所述第二哈希值,确定所述唯一标识信息,包括:
确定当前操作***、当前软件架构以及所述目标项目的目标应用程序接口的第三哈希值;
基于所述第一哈希值、第二哈希值以及所述第三哈希值,确定所述唯一标识信息。
一种可选的实施方式中,所述将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并安装所述服务器反馈的与所述唯一标识信息匹配的依赖文件,包括:
以流式下载方式将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并在下载的过程中对已下载的依赖文件进行解压;
在将所述服务器反馈的依赖文件完全下载与解压后,安装解压后的依赖文件。
第二方面,本公开实施例还提供一种依赖处理装置,包括:
获取模块,用于获取待安装依赖的目标项目的基本描述文件及依赖描述文件;
确定模块,用于基于所述基本描述文件及所述依赖描述文件,确定所述目标项目对应的依赖文件的唯一标识信息;
安装模块,用于从本地缓存中搜索与所述唯一标识信息匹配的依赖文件,将从所述本地缓存中搜索得到的依赖文件作为所述目标项目的依赖文件,并安装搜索得到的所述依赖文件。
一种可选的实施方式中,所述安装模块还用于:
当所述本地缓存中不存在与所述唯一标识信息匹配的依赖文件时,向服务器请求与所述唯一标识信息匹配的依赖文件;
将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并安装所述服务器反馈的与所述唯一标识信息匹配的依赖文件。
一种可选的实施方式中,所述安装模块还用于:
当所述服务器中不存在与所述唯一标识信息匹配的依赖文件时,向依赖数据库请求所述目标项目对应的依赖文件;
将所述依赖数据库反馈的依赖文件作为与所述唯一标识信息关联的依赖文件存储至所述本地缓存,并安装所述依赖数据库反馈的依赖文件。
一种可选的实施方式中,所述安装模块在将所述依赖数据库反馈的依赖文件作为与所述唯一标识信息关联的依赖文件存储至所述本地缓存之后,还用于:
将与所述唯一标识信息关联的依赖文件上传至所述服务器。
一种可选的实施方式中,所述目标项目包含多个子目标项目;所述基本描述文件包括主基本描述文件及多个子基本描述文件;
所述确定模块具体用于:
确定所述主基本描述文件及所述多个子基本描述文件中依赖描述字段的第一哈希值;
确定所述依赖描述文件的第二哈希值;
基于所述第一哈希值及所述第二哈希值,确定所述唯一标识信息。
一种可选的实施方式中,所述确定模块在基于所述第一哈希值及所述第二哈希值,确定所述唯一标识信息时,用于:
确定当前操作***、当前软件架构以及所述目标项目的目标应用程序接口的第三哈希值;
基于所述第一哈希值、第二哈希值以及所述第三哈希值,确定所述唯一标识信息。
一种可选的实施方式中,所述安装模块在将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并安装所述服务器反馈的与所述唯一标识信息匹配的依赖文件时,用于:
以流式下载方式将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并在下载的过程中对已下载的依赖文件进行解压;
在将所述服务器反馈的依赖文件完全下载与解压后,安装解压后的依赖文件。
第三方面,本公开实施例还提供一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
第四方面,本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
本公开实施例提供的依赖处理方法及装置,首先获取待安装依赖的目标项目的基本描述文件及依赖描述文件;然后,基于所述基本描述文件及所述依赖描述文件,确定所述目标项目对应的依赖文件的唯一标识信息;最后,从本地缓存中搜索与所述唯一标识信息匹配的依赖文件,将从所述本地缓存中搜索得到的依赖文件作为所述目标项目的依赖文件,并安装搜索得到的所述依赖文件。本公开实施例通过确定目标项目需要的依赖文件的唯一标识,从本地缓存中搜索匹配的依赖文件,使得目标项目可以使用依赖描述不同,但内容相同的依赖文件,从而避免下载依赖所需的时间,提高依赖文件安装的效率。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。
经研究发现,随着项目仓库中的项目越来越多,或项目体积越来越大,尤其是Monorepo项目,依赖的下载及安装的速度会越来越慢,导致开发效率较低。
基于上述研究,本公开提供了一种依赖处理方法,通过确定目标项目需要的依赖文件的唯一标识,从本地缓存中搜索匹配的依赖文件,使得目标项目可以使用依赖描述不同,但内容相同的依赖文件,从而避免下载依赖所需的时间,提高依赖文件安装的效率。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种依赖处理方法进行详细介绍,本公开实施例所提供的依赖处理方法的执行主体一般为具有一定计算能力的计算机设备。在一些可能的实现方式中,该依赖处理方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
参见图1所示,为本公开实施例提供的依赖处理方法的流程图,所述方法包括步骤S101~S103,其中:
S101、获取待安装依赖的目标项目的基本描述文件及依赖描述文件。
上述基本描述文件可以为package.json文件,该文件通常位于项目的根目录下,定义了目标项目所需要的各种模块,以及目标项目的配置信息(如名称、版本、许可证的元数据)。上述依赖描述文件可以为lock文件,如yarn.lock。在lock文件中,可以包含有关已安装的每个依赖项的确切版本的信息以及代码的校验。
S102、基于所述基本描述文件及所述依赖描述文件,确定所述目标项目对应的依赖文件的唯一标识信息。
该步骤中,可以利用基本描述文件和依赖描述文件确定目标项目对应的依赖文件的唯一标识,示例性的,可以从基本描述文件中读取出需要的依赖信息,计算从基本描述文件中读取出的依赖信息的哈希值,并计算依赖描述文件的哈希值,通过将读取的依赖信息的哈希值与依赖描述文件的哈希值进行合并,得到依赖文件的唯一标识信息。其中,Node.js为目标项目的解析器。
这样,通过基本描述文件中读取的信息及依赖描述文件的哈希值得到的唯一标识信息,能够在一定程度上描述所需的依赖文件的特征,可以利用唯一标识信息进行依赖文件的匹配。
进一步的,若目标项目是Monorepo项目,其中含有多个子目标项目,基本描述文件包括主基本描述文件及多个子基本描述文件,则可以通过以下步骤确定唯一标识信息:
S201、确定所述主基本描述文件及所述多个子基本描述文件中依赖描述字段的第一哈希值。
S202、确定所述依赖描述文件的第二哈希值。
S203、基于所述第一哈希值及所述第二哈希值,确定所述唯一标识信息。
该步骤中,由于Monorepo项目的结构较为复杂,需要先获取目标项目顶层的主基本描述文件,再获取各个子目标项目的子基本描述文件,分别提取信息,其中,基本描述文件可以为package.json文件,依赖描述文件可以为lock文件。
示例性的,可以提取主基本描述文件中的devDependencies、dependencies、resolutions、workspaces.nohoist等依赖描述字段,然后提取各个子基本描述文件中devDependencies、dependencies、name等依赖描述字段,再利用name字段过滤掉整个目标项目的依赖变化,比如,由于内部包的版本变化对依赖不产生影响,可以过滤掉内部之间相互的依赖,从而提高依赖文件的匹配成功率。
在得到各个依赖描述字段后,可以确定各个依赖描述字段的哈希值,得到第一哈希值,并确定依赖描述文件的第二哈希值,将第一哈希值与第二哈希值合并得到唯一标识信息。
在一种可能的实施方式中,可以直接将各个依赖描述字段与第二哈希值进行合并,得到唯一标识信息。
进一步的,还可以获取目标项目对应的***信息、架构信息及Node.js版本等信息,并确定其对应的哈希值,将读取的依赖信息的哈希值与依赖描述文件的哈希值、以及***信息、架构信息及Node.js版本等信息对应的哈希值,确定唯一标识信息。
其中,***信息可以为当前操作***的信息,架构信息可以为当前软件架构的信息,Node.js版本为目标项目的目标应用程序接口的信息。
进一步的,可以将读取的Node.js版本替换为N-API版本,N-API为用于构建本机插件的应用程序端口,是跨Node.js版本的应用程序二进制接口,相较于Node.js版本,N-API版本在进行依赖文件匹配时具有更高的匹配成功率,且不会影响到目标项目与依赖文件之间的适配度。
S103、从本地缓存中搜索与所述唯一标识信息匹配的依赖文件,将从所述本地缓存中搜索得到的依赖文件作为所述目标项目的依赖文件,并安装搜索得到的所述依赖文件。
在得到唯一标识信息后,可以从本地缓存中搜索与唯一标识信息匹配的依赖文件,若搜索到,则可以将搜索到的依赖文件作为目标项目的依赖文件,并将其安装。
该步骤中,本地缓存中存储的依赖文件可以为目标项目或其他项目在安装依赖时下载的依赖文件,由于唯一标识信息能够表征依赖文件的内容及其对应的基本描述信息,通过进行唯一标识信息的匹配,可以确定本地缓存中的依赖文件是否能够支持目标项目的运行。
在本地缓存中不存在与唯一标识信息匹配的依赖文件时,客户端可以向服务器请求与上述唯一标识信息匹配的依赖文件,服务器在接收到请求后,可以确定请求的依赖文件是否存在,若存在,则将其发送至客户端,客户端接收到服务器反馈的依赖文件并将其存储至本地缓存中,对接收到的依赖文件进行安装。
这样,本次安装的依赖文件会存储在本地缓存中,若其他项目在安装依赖的过程中,需要的依赖文件的唯一标识信息与本次安装的依赖文件的唯一标识信息匹配,即可将本次安装的依赖文件作为该其他项目的依赖文件,不需要向服务器请求该其他项目的依赖文件,提高依赖安装的效率。
进一步的,若服务器中不存在与上述唯一标识信息匹配的依赖文件,可以向依赖数据库请求目标项目对应的依赖文件;然后,将依赖数据库反馈的依赖文件作为与唯一标识信息关联的依赖文件存储至所述本地缓存,并安装依赖数据库反馈的依赖文件。
示例性的,可以为依赖数据库反馈的依赖文件分配一段字符串,该字符串可以为与上述唯一标识信息匹配的字符串,比如,直接将上述唯一标识信息分配给反馈的依赖文件,这样,在目标项目重新安装依赖文件时,或其他项目安装依赖文件时,即可利用上述反馈的依赖文件进行安装。
在从依赖数据库得到与上述唯一标识信息关联的依赖文件后,可以将其上传至服务器,这样,可以直接通过服务器获取到该唯一标识信息关联的依赖文件。
一种可能的实施方式中,可以使用流式下载的方式将服务器反馈的依赖文件存储至本地缓存中,并在下载过程中对其进行解压,在完全下载与解压后安装解压后的依赖文件,将下载与解压同步进行,提高安装依赖的效率。
本公开实施例提供的依赖处理方法,首先获取待安装依赖的目标项目的基本描述文件及依赖描述文件;然后,基于所述基本描述文件及所述依赖描述文件,确定所述目标项目对应的依赖文件的唯一标识信息;最后,从本地缓存中搜索与所述唯一标识信息匹配的依赖文件,将从所述本地缓存中搜索得到的依赖文件作为所述目标项目的依赖文件,并安装搜索得到的所述依赖文件。本公开实施例通过确定目标项目需要的依赖文件的唯一标识,从本地缓存中搜索匹配的依赖文件,使得目标项目可以使用依赖描述不同,但内容相同的依赖文件,从而避免下载依赖所需的时间,提高依赖文件安装的效率。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与依赖处理方法对应的依赖处理装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述依赖处理方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
参照图3所示,为本公开实施例提供的一种依赖处理装置的示意图,所述装置包括:
获取模块310,用于获取待安装依赖的目标项目的基本描述文件及依赖描述文件;
确定模块320,用于基于所述基本描述文件及所述依赖描述文件,确定所述目标项目对应的依赖文件的唯一标识信息;
安装模块330,用于从本地缓存中搜索与所述唯一标识信息匹配的依赖文件,将从所述本地缓存中搜索得到的依赖文件作为所述目标项目的依赖文件,并安装搜索得到的所述依赖文件。
一种可选的实施方式中,所述安装模块330还用于:
当所述本地缓存中不存在与所述唯一标识信息匹配的依赖文件时,向服务器请求与所述唯一标识信息匹配的依赖文件;
将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并安装所述服务器反馈的与所述唯一标识信息匹配的依赖文件。
一种可选的实施方式中,所述安装模块330还用于:
当所述服务器中不存在与所述唯一标识信息匹配的依赖文件时,向依赖数据库请求所述目标项目对应的依赖文件;
将所述依赖数据库反馈的依赖文件作为与所述唯一标识信息关联的依赖文件存储至所述本地缓存,并安装所述依赖数据库反馈的依赖文件。
一种可选的实施方式中,所述安装模块330在将所述依赖数据库反馈的依赖文件作为与所述唯一标识信息关联的依赖文件存储至所述本地缓存之后,还用于:
将与所述唯一标识信息关联的依赖文件上传至所述服务器。
一种可选的实施方式中,所述目标项目包含多个子目标项目;所述基本描述文件包括主基本描述文件及多个子基本描述文件;
所述确定模块320具体用于:
确定所述主基本描述文件及所述多个子基本描述文件中依赖描述字段的第一哈希值;
确定所述依赖描述文件的第二哈希值;
基于所述第一哈希值及所述第二哈希值,确定所述唯一标识信息。
一种可选的实施方式中,所述确定模块320在基于所述第一哈希值及所述第二哈希值,确定所述唯一标识信息时,用于:
确定当前操作***、当前软件架构以及所述目标项目的目标应用程序接口的第三哈希值;
基于所述第一哈希值、第二哈希值以及所述第三哈希值,确定所述唯一标识信息。
一种可选的实施方式中,所述安装模块330在将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并安装所述服务器反馈的与所述唯一标识信息匹配的依赖文件时,用于:
以流式下载方式将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并在下载的过程中对已下载的依赖文件进行解压;
在将所述服务器反馈的依赖文件完全下载与解压后,安装解压后的依赖文件。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
对应于图1中的依赖处理方法,本公开实施例还提供了一种电子设备400,如图4所示,为本公开实施例提供的电子设备400结构示意图,包括:
处理器41、存储器42、和总线43;存储器42用于存储执行指令,包括内存421和外部存储器422;这里的内存421也称内存储器,用于暂时存放处理器41中的运算数据,以及与硬盘等外部存储器422交换的数据,处理器41通过内存421与外部存储器422进行数据交换,当所述电子设备400运行时,所述处理器41与所述存储器42之间通过总线43通信,使得所述处理器41执行以下指令:
获取待安装依赖的目标项目的基本描述文件及依赖描述文件;
基于所述基本描述文件及所述依赖描述文件,确定所述目标项目对应的依赖文件的唯一标识信息;
从本地缓存中搜索与所述唯一标识信息匹配的依赖文件,将从所述本地缓存中搜索得到的依赖文件作为所述目标项目的依赖文件,并安装搜索得到的所述依赖文件。
一种可选的实施方式中,所述处理器41还用于执行:
当所述本地缓存中不存在与所述唯一标识信息匹配的依赖文件时,向服务器请求与所述唯一标识信息匹配的依赖文件;
将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并安装所述服务器反馈的与所述唯一标识信息匹配的依赖文件。
一种可选的实施方式中,所述处理器41还用于执行:
当所述服务器中不存在与所述唯一标识信息匹配的依赖文件时,向依赖数据库请求所述目标项目对应的依赖文件;
将所述依赖数据库反馈的依赖文件作为与所述唯一标识信息关联的依赖文件存储至所述本地缓存,并安装所述依赖数据库反馈的依赖文件。
一种可选的实施方式中,将所述依赖数据库反馈的依赖文件作为与所述唯一标识信息关联的依赖文件存储至所述本地缓存之后,所述处理器41还用于执行:
将与所述唯一标识信息关联的依赖文件上传至所述服务器。
一种可选的实施方式中,所述目标项目包含多个子目标项目;所述基本描述文件包括主基本描述文件及多个子基本描述文件;
所述处理器41在基于所述基本描述文件及所述依赖描述文件,确定所述目标项目对应的依赖文件的唯一标识信息时,用于执行:
确定所述主基本描述文件及所述多个子基本描述文件中依赖描述字段的第一哈希值;
确定所述依赖描述文件的第二哈希值;
基于所述第一哈希值及所述第二哈希值,确定所述唯一标识信息。
一种可选的实施方式中,所述处理器41在基于所述第一哈希值及所述第二哈希值,确定所述唯一标识信息时:
确定当前操作***、当前软件架构以及所述目标项目的目标应用程序接口的第三哈希值;
基于所述第一哈希值、第二哈希值以及所述第三哈希值,确定所述唯一标识信息。
一种可选的实施方式中,所述处理器41在将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并安装所述服务器反馈的与所述唯一标识信息匹配的依赖文件时,用于执行:
以流式下载方式将所述服务器反馈的与所述唯一标识信息匹配的依赖文件存储至所述本地缓存中,并在下载的过程中对已下载的依赖文件进行解压;
在将所述服务器反馈的依赖文件完全下载与解压后,安装解压后的依赖文件。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的依赖处理方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的依赖处理方法的步骤,具体可参见上述方法实施例,在此不再赘述。
其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的***和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的***、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。