CN115268991A - 依赖分析的优化方法、装置、设备和存储介质 - Google Patents
依赖分析的优化方法、装置、设备和存储介质 Download PDFInfo
- Publication number
- CN115268991A CN115268991A CN202210936938.9A CN202210936938A CN115268991A CN 115268991 A CN115268991 A CN 115268991A CN 202210936938 A CN202210936938 A CN 202210936938A CN 115268991 A CN115268991 A CN 115268991A
- Authority
- CN
- China
- Prior art keywords
- character
- dependency
- current
- characters
- dependent
- 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/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
Abstract
本申请提出一种依赖分析的优化方法、装置、设备和存储介质,该方法包括:扫描并读取软件项目中的目标文件;根据读取到的依赖项生成依赖分析文件,其中,依赖项包括所指示的依赖包的相关信息;定位依赖项中的动态变量代码,提取动态变量代码中的动态变量;在对应的匹配文件中查找动态变量所对应的变量取值;利用变量取值替换依赖分析文件中对应的动态变量代码。本申请实现了动态变量代码到变量取值的转换,增加了依赖分析工具对动态变量代码的语法解析功能,使得依赖分析更加完善,减少了分析报错和数据丢失。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种依赖分析的优化方法、装置、设备和存储介质。
背景技术
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。通过Gradle可以对所在软件项目中的依赖包进行统一管理和依赖关系配置。
为了便于研发人员更直接清楚的梳理依赖包之间的依赖关系,以及时发现错误,现有技术一般是通过依赖分析技术来对Gradle中的相关文件进行扫描分析。但是现有的依赖分析技术对于新的语法例如动态变量代码无法识别,导致最终输出的依赖分析报告内容缺失或不准确。
发明内容
为了解决现有依赖分析技术中对动态变量代码无法识别,导致依赖分析数据丢失和匹配不准确的技术问题。本申请提供了一种依赖分析的优化方法、装置、设备和存储介质,其主要目的在于准确识别项目文件中的动态变量代码并获取对应的变量取值,完善优化依赖分析技术,使依赖分析结果数据完整准确。
为实现上述目的,本申请提供了一种依赖分析的优化方法,该方法包括:
扫描并读取软件项目中的目标文件;
根据读取到的依赖项生成依赖分析文件,其中,依赖项包括所指示的依赖包的相关信息;
定位依赖项中的动态变量代码,提取动态变量代码中的动态变量;
在对应的匹配文件中查找动态变量所对应的变量取值;
利用变量取值替换依赖分析文件中对应的动态变量代码。
此外,为实现上述目的,本申请还提供了一种依赖分析的优化装置,该装置包括:
扫描模块,用于扫描并读取软件项目中的目标文件;
生成模块,用于根据读取到的依赖项生成依赖分析文件,其中,依赖项包括所指示的依赖包的相关信息;
定位提取模块,用于定位依赖项中的动态变量代码,提取动态变量代码中的动态变量;
查找模块,用于在对应的匹配文件中查找动态变量所对应的变量取值;
替换模块,用于利用变量取值替换依赖分析文件中对应的动态变量代码。
为实现上述目的,本申请还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机可读指令,处理器执行计算机可读指令时执行如前面任一项的依赖分析的优化方法的步骤。
为实现上述目的,本申请还提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机可读指令,计算机可读指令被处理器执行时,使得处理器执行如前面任一项的依赖分析的优化方法的步骤。
本申请提出的依赖分析的优化方法、装置、设备和存储介质,实现了动态变量代码到变量取值的转换,增加了依赖分析工具对动态变量代码的语法解析功能,使得依赖分析更加完善,减少了分析报错和数据丢失,解决了现有技术对动态语法不兼容、扫描出错、甚至缺失数据等重大问题,提高了数据匹配的准确性。另外获得的脚本依赖分析文件可以用于依赖的升级和维护。另外,增加依赖分析工具的语法解析功能可以兼容更多安卓语法,实现对更多gradle文件的扫描出来,扩大依赖分析工具的使用范围。对于研发而言,可以增加动态变量的使用,提高开发效率。
附图说明
图1为本申请一实施例中依赖分析的优化方法的流程示意图;
图2为本申请一实施例中依赖分析的优化装置的结构框图;
图3为本申请一实施例中计算机设备的内部结构框图。
本申请目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请的一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
图1为本申请一实施例中依赖分析的优化方法的流程示意图。参考图1,该依赖分析的优化方法包括以下步骤S100-S500。
S100:扫描并读取软件项目中的目标文件。
具体地,加载安装依赖分析工具,通过依赖分析工具扫描安卓软件项目下已加载的Gradle相关文件,找出其中的目标文件,并对每个目标文件进行扫描和依赖项的读取,以此整理软件项目所依赖的依赖包或第三方库。
其中,Gradle相关文件之间可能具有层级关系和包含关系。因此,每遍历到一个Gradle相关文件,都要展开其所包含的所有其他Gradle相关文件,以对每个Gradle相关文件都进行目标文件判断。对于非目标文件如果其不包含其他Gradle相关文件则跳过不进行深入扫描和读取,如果包含其他Gradle相关文件则通过展开遍历其所包含的其他Gradle相关文件。对于目标文件则对其数据内容进行扫描,以识别并读取其所包含的依赖项(dependencies)。
其中,目标文件具体为Gradle相关文件中的项目依赖文件或项目配置文件。目标文件中可能自定义有依赖包对应的相关信息或依赖信息。
另外,可以通过fs模块读取目标文件。
在一个具体实施例中,步骤S100具体包括:
遍历待分析项目的文件,获取每个遍历到的文件的文件格式;
将.gradle格式的文件作为目标文件进行读取和扫描。
具体地,为了减少对不必要的文件的扫描和读取,可以通过文件后缀是否为.gradle来定位目标文件。.gradle包括build.gradle文件,例如:以/.app/build.gradle作为路径,找到/build.gradle作为入口文件;以./core/build.gradle作为路径,找到找到/build.gradle作为入口文件。在build.gradle文件中可以找到其他.gradle的文件,例如config.gradle文件、setting.gradle文件等。这样可以减少无效扫描,提升依赖分析的效率。
S200:根据读取到的依赖项生成依赖分析文件,其中,依赖项包括所指示的依赖包的相关信息。
具体地,依赖包即依赖组件或第三方代码库(第三方库)。通过依赖分析可以获取到软件项目所依赖的所有依赖包及依赖包的相关信息。相关信息包括依赖包的标识(例如依赖包的名称),还可以包括依赖包的当前版本信息、存储路径中的一种或多种但不局限于此。
例如,com.android.support:support-annotations:21.2.1为一条依赖项;
com.android.support:transition:25.1.3为一条依赖项等不局限于此。
S300:定位依赖项中的动态变量代码,提取动态变量代码中的动态变量。
具体地,动态变量代码为包含动态变量的代码,函数中的局部变量不加static关键字修饰就是动态变量。每次调用该函数时,系统会给这个动态变量分配存储空间,该函数调用结束释放其存储空间,即,动态变量每次被调用都会被赋初值。另外,动态变量代码满足使用简洁且灵活的特性,因此在目标文件中使用动态变量代码可以提高开发效率。
例如,一条依赖项可能包括当前版本信息,有的依赖项的当前版本信息是一个确定的版本信息即确定值,有的依赖项的当前版本信息是通过动态变量代码来定义赋值的,并不是一个确定值。特别是研发人员进行依赖配置的时候可能暂时不知道某些依赖包的版本信息,因此,可以预先使用动态变量代码来定义。
但是现有的依赖分析技术无法对动态变量代码进行识别,因此,现有的依赖分析技术功能不够完善、存在一定的局限性。
动态变量代码有多种不同的约定书写形式,例如:${xxxx[aaa]}、${aaa}、${aaa.bbb}、{{aaa.bbb}}等不局限于此。
其中,${xxxx[aaa]}中的动态变量为xxxx[aaa];${aaa}中的动态变量为aaa,${aaa.bbb}中的动态变量为aaa.bbb;{{aaa.bbb}}中的动态变量为aaa.bbb。
S400:在对应的匹配文件中查找动态变量所对应的变量取值。
具体地,匹配文件为与动态变量代码所对应的目标文件关联的文件。例如,在项目A中有目标文件x,目标文件x为被分析的依赖文件,目标文件x可以通过import/require语法,引入另一个文件y,这个文件y就是目标文件x的匹配文件或关联文件。在一个项目中不止一个Gradle相关文件,一个Gradle相关文件可能没有匹配文件也可能有一个匹配文件还可能有多个匹配文件。
例如,对于动态变量代码${xxxx[aaa]},其动态变量为xxxx[aaa]。目标文件x的匹配文件y包含了xxxx[aaa]="v1.0.0",那么动态变量xxxx[aaa]的变量取值为"v1.0.0"。通过对目标文件x中的动态变量代码${xxxx[aaa]}可以读取到"v1.0.0"。
S500:利用变量取值替换依赖分析文件中对应的动态变量代码。
具体地,步骤S200中生成的依赖分析文件依然是以动态变量代码来展示,因此,需要将依赖分析文件中的动态变量代码替换为实际变量取值。
本实施例准确识别目标文件中的动态变量代码并获取对应的变量取值,完善优化依赖分析技术,使依赖分析结果数据完整准确。实现了动态变量代码到变量取值的转换,增加了依赖分析工具对动态变量代码的语法解析功能,使得依赖分析更加完善,减少了分析报错和数据丢失,解决了现有技术对动态语法不兼容、扫描出错、甚至缺失数据等重大问题,提高了数据匹配的准确性。另外获得的脚本依赖分析文件可以用于依赖的升级和维护。另外,增加依赖分析工具的语法解析功能可以兼容更多安卓语法,扩大依赖分析工具的使用范围。对于研发而言,可以增加动态变量的使用,提高开发效率。
在一个实施例中,定位依赖项中的动态变量代码,提取动态变量代码中的动态变量,包括:
读取当前依赖项中的字符,根据读取的字符确定当前依赖项中是否包含目标字符组合;
若包含目标字符组合,则确定在当前依赖项中、从目标字符组合中的第一个特征字符到最后一个特征字符的所有字符组成动态变量代码;
提取动态变量代码中目标字符组合之间的其他字符组成动态变量。
具体地,读取当前依赖项中的字符,根据读取的字符可以确定当前依赖项的字符组成,字符组成用于指示当前依赖项所包含的字符以及字符的排列顺序。如果根据字符组成确定当前依赖项中包含目标字符组合则确定当前依赖项存在动态变量代码。目标字符组合包括多个特征字符且特征字符之间是按照预设的先后顺序出现在代码中,用于指示动态变量。
项目的Gradle相关文件中可能有多种不同语法的动态变量代码,也可以使用统一语法的动态变量代码。不同语法的动态变量代码对应的目标字符组合可能不同。例如,${xxxx[aaa]}、${aaa}、${aaa.bbb}、${aaa[“bbb”]}的目标字符组合均为${};而{{aaa.bbb}}、{{aaa[bbb]}}的目标字符组合均为{{}}。
每读取一个依赖项就对该依赖项进行字符读取,以获取该依赖项的字符组成,如果根据字符组成确定当前依赖项中包含了任意一个或多个目标字符组合则确定存在动态变量代码。此外,动态变量代码为目标字符组合与位于目标字符组合之间的其他字符所组成的一串代码。即,包括目标字符组合中的第一个特征字符和最后一个特征字符在内从目标字符组合的第一个特征字符到最后一个特征字符的所有字符组成动态变量代码。
在一个实施例中,根据读取的字符确定当前依赖项中是否包含目标字符组合,包括:获取读取到的每个字符的ASCII码,若包含所有特征字符的ASCII码且所有特征字符之间的排列顺序满足预设顺序,则确定当前依赖项包含对应的目标字符组合。
具体地,ASCII码全称美国信息交换标准代码,每个打印字符都有对应的ASCII码,在ASCII码对照表中可以查找到读取到的每个字符的ASCII码。根据ASCII码可以判断读取到的当前字符是否为特征字符。
根据读取到的每个字符的ASCII码可以确定当前依赖项的字符组成;如果获取到了所有特征字符的ASCII码则表示当前依赖项包含了所有特征字符,如果所有特征字符满足对应目标字符组合中特征字符的先后组成顺序,则确定当前依赖项包含对应的目标字符组合。
获取目标字符组合中第一个特征字符的第一标识位和最后一个特征字符的第二标识位,根据第一标识位和第二标识位确定当前依赖项中从第一标识位到第二标识位之间包括第一特征字符和最后一个特征字符在内的所有字符组成动态变量代码。
获取第一个特征字符之后第一个非特征字符的第三标识位,以及最后一个非特征字符的第四标识位,根据第三标识位和第四标识位确定组成动态变量的目标字符。
在一个实施例中,获取读取到的每个字符的ASCII码,若包含所有特征字符的ASCII码且所有特征字符之间的排列顺序满足预设顺序,则确定当前依赖项包含对应的目标字符组合,包括:
获取读取到的字符的ASCII码,根据ASCII码确定对应字符是否为特征字符;
获取特征字符的标识位;
若当前依赖项包含所有特征字符,则根据标识位确定所有特征字符之间是否存在满足预设顺序的组合;
若存在满足预设顺序的组合,则确定当前依赖项包含对应的目标字符组合,若不存在满足预设顺序的组合,则确定当前依赖项不包含对应的目标字符组合;
若当前依赖项不包含所有特征字符,则确定当前依赖项不包含对应目标字符组合。
具体地,根据ASCII码可以确定读取到的当前字符是否为特征字符。例如,”${}”为目标字符组合,其中,”$”为一个特征字符,其ASCII码为36,”{”为一个特征字符,其ASCII码为123,”}”为一个特征字符,其ASCII码为125。
在读取过程中可能会读取到多个相同的特征字符,为了方便判断这些特征字符是否能够组成目标字符组合,需要记录特征字符的标识位,标识位用于指示特征字符在依赖项的所有字符中的位置。字符读取识别完成后,如果识别到的特征字符中不包含目标字符组合中的所有特征字符,则直接判断当前依赖项不包含目标字符组合;如果包含所有特征字符,则还需要继续根据特征字符的标识位来判断读取到的特征字符中是否存在满足预设顺序的组合,由于可能读取到的特征字符有多余,因此只需要判断是否有满足预设顺序的组合即可。例如,”$”的标识位与”{”的标识位相差一位,”{”的标识位与”}”的标识位至少相差一位。
本实施例通过标识位来定位特征字符并对特征字符进行排列顺序的验证来判断是否包含目标字符组合,进而判断是否包含动态变量代码,判断准确。
在一个实施例中,获取读取到的每个字符的ASCII码,若包含所有特征字符的ASCII码且所有特征字符之间的排列顺序满足预设顺序,则确定当前依赖项包含对应的目标字符组合,包括:
执行下述步骤,直到读取完成:
获取读取到的字符的ASCII码,根据ASCII码确定对应字符是否为特征字符,若为特征字符,则获取对应的标识位,根据标识位判断相邻的两个特征字符是否满足对应的子预设顺序,
若相邻的特征字符不满足对应的子预设顺序,则在当前定位的第一个特征字符之后重新定位一个新位置的第一个特征字符,执行步骤获取读取到的字符的ASCII码,根据ASCII码确定对应字符是否为特征字符,若为特征字符,则获取对应的标识位,根据标识位判断相邻的两个特征字符是否满足对应的子预设顺序,
若相邻的特征字符满足对应的子预设顺序,则在后续字符中继续定位其他特征字符,执行步骤获取读取到的字符的ASCII码,根据ASCII码确定对应字符是否为特征字符,若为特征字符,则获取对应的标识位,根据标识位判断相邻的两个特征字符是否满足对应的子预设顺序;
读取完成后,若最终确定的特征字符中包含所有特征字符,且所有相邻的两个特征字符均满足对应的子预设顺序,则确定当前依赖项包含对应的目标字符组合。
具体地,获取读取到的当前字符的ASCII码,若根据当前字符的ASCII码确定读取到第一个特征字符,则将第一个特征字符作为当前特征字符,获取当前特征字符的标识位,正向读取后面字符,若读取到下一个特征字符,则获取下一个特征字符的标识位,判断当前特征字符与下一个特征字符的标识位是否满足对应的子预设顺序,若不满足则在当前第一个特征字符之后获取读取到的当前字符的ASCII码以重新定位第一个特征字符,若满足,则将下一个特征字符作为当前特征字符,执行正向读取后面字符,若读取到下一个特征字符,则获取下一个特征字符的标识位,判断当前特征字符与下一个特征字符的标识位是否满足对应的子预设顺序的步骤,直到读取完成。
更具体地,按照顺序依次读取特征字符,并对相邻的两个特征字符的实际顺序进行判断,如果在任意一个节点的两个相邻的特征字符的实际顺序不满足对应的子预设顺序,则在当前定位的第一个特征字符之后重新定位新的第一个特征字符,之前定位到的特征字符暂时作废不作为特征字符。定位到新的第一个特征字符后,从新的第一个特征字符开始定位其他特征字符,并对相邻的两个特征字符的实际顺序进行判断,如果在任意一个节点的两个相邻的特征字符的实际顺序不满足对应的子预设顺序,则在新的第一个特征字符之后再次重新定位新的第一个特征字符,如此循环,直到字符读取完毕。若最终保留的第一个特征字符及其后续其他特征字符中包含目标字符组合中的所有特征字符,则判定当前依赖包包含目标字符组合。
本实施例通过边读取字符边判断特征字符之间的顺序是否符合要求来排除中间读取到的不满足子预设顺序的特征字符的干扰,达到快速读取字符和定位有效特征字符的目的。
在一个实施例中,获取读取到的每个字符的ASCII码,若包含所有特征字符的ASCII码且所有特征字符之间的排列顺序满足预设顺序,则确定当前依赖项包含对应的目标字符组合,包括:
获取读取到的当前字符的ASCII码,若根据当前字符的ASCII码确定读取到”{”,则反向读取”{”的前一个字符,若根据前一个字符的ASCII码确定前一个字符为”$”,则通过正向读取确定”{”后面的字符中是否存在”}”,若存在”}”,则确定当前依赖项的字符组成中包含为”${}”的目标字符组合;
或,
获取读取到的当前字符的ASCII码,若根据当前字符的ASCII码确定读取到”$”,则正向读取”$”的后一个字符,若根据后一个字符的ASCII码确定后一个字符为”{”,则通过正向读取确定”{”后面的字符中是否存在”}”,若存在”}”,则确定当前依赖项的字符组成中包含为”${}”的目标字符组合。
具体地,本实施例针对目标字符组合为”${}”的动态变量代码进行识别和分析。如果在所有目标文件中通用这种类型的动态变量代码,可以采用本实施例的方案,能够更快更准确的定位动态变量代码和动态变量。
按照顺序依次读取每个字符,如果根据当前字符的ASCII码确定读取到”{”,则反向读取”{”的前一个字符,获取前一个字符的ASCII码,如果根据前一个字符的ASCII码确定前一个字符为”$”,则通过正向读取确定”{”后面的字符中是否存在”}”,如果”{”后面的字符中存在”}”,则确定当前依赖项的字符组成中包含为”${}”的目标字符组合,确定当前依赖项存在动态变量代码。如果根据前一个字符的ASCII码确定前一个字符不为”$”,则重新定位一个新的”{”,在定位到新的”{”之后,反向读取判断新的”{”之前的字符是否为”$”,如果是,则判断在”{”后面的字符中是否存在”}”,如此循环直到字符读取完成,确定是否存在”${}”。
同理,通过正向读取也可以判断是否存在”${}”,此处不再赘述。
本实施例是正向读取判断是否出现特征字符且特征字符的排列顺序符合预设的顺序。
如果所有目标文件中有至少2种不同类型的动态变量代码,则需要考虑所包含的所有类型的动态变量代码的识别。具体根据目标文件中的配置来确定规则。
本实施例在找出”{”和”$”后往后继续找”}”,若找到”}”后反查”}”之前的字符直到反查到”{”后停止,将反查过程中除”{”和”}”之外的字符提取出来组成动态变量。
在一个实施例中,根据读取到的依赖项生成依赖分析文件,包括:
根据获取到的依赖包以及依赖包之间的依赖关系生成树形结构的依赖分析文件。
具体地,依赖包之间也可能存在依赖关系,因此为了方便查看依赖包之间的引用关系和层级关系,以树形结构的方式生成依赖分析文件。
例如项目A被依赖分析工具(例如gradle2js工具)扫描,就可以获取到项目A依赖了哪些其他代码库(依赖包)、在项目A中每个代码库当前所使用的版本、某些代码库又依赖了哪些其他代码库,这样就形成了一条依赖链。因此,将具有依赖关系的依赖项通过树形结构关联写入依赖分析文件中,使得依赖项对应的依赖包之间的层级关系以及依赖关系清楚明了。便于研发人员对软件项目中所引用的依赖包的维护和管理以及冲突检验等。
依赖分析文件可以为json格式,依赖分析工具可以使用gradle2js(gradle-to-js)工具。通过对gradle相关文件进行依赖分析得到json格式的依赖分析文件,该依赖分析文件中以json格式按照树形结构写入依赖项,简单直观。
在一个实施例中,在利用变量取值替换依赖分析文件中对应的动态变量代码之后,该方法还包括:
读取依赖分析文件中各个依赖项所指示的依赖包的版本信息作为当前版本信息;
将同一个依赖包的当前版本信息与获取到的最新版本信息进行比较;
若当前版本信息所指示的版本低于最新版本信息所指示的版本,则向项目人员发送依赖包版本更新提醒。
具体地,在实际应用中,会经常对某一安卓项目所使用的第三方代码库之间依赖关系进行调整,当依赖关系中某一节点被调整后,会导致整个依赖关系发生巨大变化,通过本申请的依赖分析可以对依赖关系进行更直观的感知。
依赖包可能会不断升级,软件项目中配置的依赖包的版本号可能不是最新的版本号。因此,通过将依赖分析文件中各个依赖包的当前版本与获取到的最新版本进行比对,可以快速定位版本落后的依赖包,进而提醒项目人员及时更新软件项目中对应依赖包的版本。极大方便了对依赖包版本的维护和管理以及及时更新。
另外,还可以自动向项目人员展示依赖分析文件,以便于项目人员对依赖包的配置进行检查核对以及冲突检测等。
图2为本申请一实施例中依赖分析的优化装置的结构框图。参考图2,该依赖分析的优化装置包括:
扫描模块100,用于扫描并读取软件项目中的目标文件;
生成模块200,用于根据读取到的依赖项生成依赖分析文件,其中,依赖项包括所指示的依赖包的相关信息;
定位提取模块300,用于定位依赖项中的动态变量代码,提取动态变量代码中的动态变量;
查找模块400,用于在对应的匹配文件中查找动态变量所对应的变量取值;
替换模块500,用于利用变量取值替换依赖分析文件中对应的动态变量代码。
在一个实施例中,定位提取模块300具体包括:
字符组合判断模块,用于读取当前依赖项中的字符,根据读取的字符确定当前依赖项中是否包含目标字符组合;
代码定位模块,用于若包含目标字符组合,则确定在当前依赖项中、从目标字符组合中的第一个特征字符到最后一个特征字符的所有字符组成动态变量代码;
提取模块,用于提取动态变量代码中目标字符组合之间的其他字符组成动态变量。
在一个实施例中,字符组合判断模块,具体用于获取读取到的每个字符的ASCII码,若包含所有特征字符的ASCII码且所有特征字符之间的排列顺序满足预设顺序,则确定当前依赖项包含对应的目标字符组合。
在一个实施例中,字符组合判断模块具体包括:
特征字符判断模块,用于获取读取到的字符的ASCII码,根据ASCII码确定对应字符是否为特征字符;
定位模块,用于获取特征字符的标识位;
组合判断模块,用于若当前依赖项包含所有特征字符,则根据标识位确定所有特征字符之间是否存在满足预设顺序的组合;
第一判定模块,用于若存在满足预设顺序的组合,则确定当前依赖项包含对应的目标字符组合,若不存在满足预设顺序的组合,则确定当前依赖项不包含对应的目标字符组合;
第二判定模块,用于若当前依赖项不包含所有特征字符,则确定当前依赖项不包含对应目标字符组合。
在一个实施例中,字符组合判断模块具体包括:
第一判断模块,用于获取读取到的当前字符的ASCII码,若根据当前字符的ASCII码确定读取到”{”,则反向读取”{”的前一个字符,若根据前一个字符的ASCII码确定前一个字符为”$”,则通过正向读取确定”{”后面的字符中是否存在”}”,若存在”}”,则确定当前依赖项中包含为”${}”的目标字符组合;
或,
第二判断模块,用于获取读取到的当前字符的ASCII码,若根据当前字符的ASCII码确定读取到”$”,则正向读取”$”的后一个字符,若根据后一个字符的ASCII码确定后一个字符为”{”,则通过正向读取确定”{”后面的字符中是否存在”}”,若存在”}”,则确定当前依赖项中包含为”${}”的目标字符组合。
在一个实施例中,生成模块200,具体用于根据获取到的依赖包以及依赖包之间的依赖关系生成树形结构的依赖分析文件。
在一个实施例中,该装置还包括:
版本信息读取模块,用于读取依赖分析文件中各个依赖项所指示的依赖包的版本信息作为当前版本信息;
比较模块,用于将同一个依赖包的当前版本信息与获取到的最新版本信息进行比较;
提醒模块,用于若当前版本信息所指示的版本低于最新版本信息所指示的版本,则向项目人员发送依赖包版本更新提醒。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
其中上述模块/单元中的“第一”和“第二”的意义仅在于将不同的模块/单元加以区分,并不用于限定哪个模块/单元的优先级更高或者其它的限定意义。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或模块的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或模块,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或模块,本申请中所出现的模块的划分,仅仅是一种逻辑上的划分,实际应用中实现时可以有另外的划分方式。
关于依赖分析的优化装置的具体限定可以参见上文中对于依赖分析的优化方法的限定,在此不再赘述。上述依赖分析的优化装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
图3为本申请一实施例中计算机设备的内部结构框图。如图3所示,该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、输入装置和显示屏。其中,该计算机设备的处理器用于提供计算和控制能力。存储器包括存储介质和内存储器。存储介质可以是非易失性存储介质,也可以是易失性存储介质。存储介质存储有操作系统,还可存储有计算机可读指令,该计算机可读指令被处理器执行时,可使得处理器实现依赖分析的优化方法。该内存储器为存储介质中的操作系统和计算机可读指令的运行提供环境。该内存储器中也可储存有计算机可读指令,该计算机可读指令被处理器执行时,可使得处理器执行依赖分析的优化方法。该计算机设备的网络接口用于与外部服务器通过网络连接通信。计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机可读指令(例如计算机程序),处理器执行计算机可读指令时实现上述实施例中依赖分析的优化方法的步骤,例如图1所示的步骤S100至步骤S500及该方法的其它扩展和相关步骤的延伸。或者,处理器执行计算机可读指令时实现上述实施例中依赖分析的优化装置的各模块/单元的功能,例如图2所示模块100至模块500的功能。为避免重复,这里不再赘述。
处理器可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific IntegratedCircuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,处理器是计算机装置的控制中心,利用各种接口和线路连接整个计算机装置的各个部分。
存储器可用于存储计算机可读指令和/或模块,处理器通过运行或执行存储在存储器内的计算机可读指令和/或模块,以及调用存储在存储器内的数据,实现计算机装置的各种功能。存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、视频数据等)等。
存储器可以集成在处理器中,也可以与处理器分开设置。
本领域技术人员可以理解,图3中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机可读指令,计算机可读指令被处理器执行时实现上述实施例中依赖分析的优化方法的步骤,例如图1所示的步骤S100至步骤S500及该方法的其它扩展和相关步骤的延伸。或者,计算机可读指令被处理器执行时实现上述实施例中依赖分析的优化装置的各模块/单元的功能,例如图2所示模块100至模块500的功能。为避免重复,这里不再赘述。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机可读指令来指示相关的硬件来完成,所述的计算机可读指令可存储于一计算机可读取存储介质中,该计算机可读指令在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(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)等。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、装置、物品或者方法不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、装置、物品或者方法所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、装置、物品或者方法中还存在另外的相同要素。
上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。
以上仅为本申请的优选实施例,并非因此限制本申请的专利范围,凡是利用本申请说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本申请的专利保护范围内。
Claims (10)
1.一种依赖分析的优化方法,其特征在于,所述方法包括:
扫描并读取软件项目中的目标文件;
根据读取到的依赖项生成依赖分析文件,其中,所述依赖项包括所指示的依赖包的相关信息;
定位所述依赖项中的动态变量代码,提取所述动态变量代码中的动态变量;
在对应的匹配文件中查找所述动态变量所对应的变量取值;
利用所述变量取值替换所述依赖分析文件中对应的动态变量代码。
2.根据权利要求1所述的方法,其特征在于,所述定位所述依赖项中的动态变量代码,提取所述动态变量代码中的动态变量,包括:
读取当前依赖项中的字符,根据读取的字符确定所述当前依赖项中是否包含目标字符组合;
若包含目标字符组合,则确定在所述当前依赖项中、从所述目标字符组合中的第一个特征字符到最后一个特征字符的所有字符组成动态变量代码;
提取所述动态变量代码中目标字符组合之间的其他字符组成动态变量。
3.根据权利要求2所述的方法,其特征在于,所述根据读取的字符确定所述当前依赖项中是否包含目标字符组合,包括:获取读取到的每个字符的ASCII码,若包含所有特征字符的ASCII码且所有特征字符之间的排列顺序满足预设顺序,则确定所述当前依赖项包含对应的目标字符组合。
4.根据权利要求3所述的方法,其特征在于,所述获取读取到的每个字符的ASCII码,若包含所有特征字符的ASCII码且所有特征字符之间的排列顺序满足预设顺序,则确定所述当前依赖项包含对应的目标字符组合,包括:
获取读取到的字符的ASCII码,根据所述ASCII码确定对应字符是否为特征字符;
获取特征字符的标识位;
若所述当前依赖项包含所有特征字符,则根据所述标识位确定所有特征字符之间是否存在满足预设顺序的组合;
若存在满足预设顺序的组合,则确定所述当前依赖项包含对应的目标字符组合,若不存在满足预设顺序的组合,则确定所述当前依赖项不包含对应的目标字符组合;
若所述当前依赖项不包含所有特征字符,则确定所述当前依赖项不包含对应目标字符组合。
5.根据权利要求3所述的方法,其特征在于,所述获取读取到的每个字符的ASCII码,若包含所有特征字符的ASCII码且所有特征字符之间的排列顺序满足预设顺序,则确定所述当前依赖项包含对应的目标字符组合,包括:
获取读取到的当前字符的ASCII码,若根据当前字符的ASCII码确定读取到”{”,则反向读取”{”的前一个字符,若根据前一个字符的ASCII码确定所述前一个字符为”$”,则通过正向读取确定”{”后面的字符中是否存在”}”,若存在”}”,则确定所述当前依赖项中包含为”${}”的目标字符组合;
或,
获取读取到的当前字符的ASCII码,若根据当前字符的ASCII码确定读取到”$”,则正向读取”$”的后一个字符,若根据后一个字符的ASCII码确定所述后一个字符为”{”,则通过正向读取确定”{”后面的字符中是否存在”}”,若存在”}”,则确定所述当前依赖项中包含为”${}”的目标字符组合。
6.根据权利要求1所述的方法,其特征在于,所述根据读取到的依赖项生成依赖分析文件,包括:
根据获取到的依赖包以及依赖包之间的依赖关系生成树形结构的依赖分析文件。
7.根据权利要求1所述的方法,其特征在于,在所述利用所述变量取值替换所述依赖分析文件中对应的动态变量代码之后,所述方法还包括:
读取所述依赖分析文件中各个依赖项所指示的依赖包的版本信息作为当前版本信息;
将同一个依赖包的所述当前版本信息与获取到的最新版本信息进行比较;
若所述当前版本信息所指示的版本低于所述最新版本信息所指示的版本,则向项目人员发送依赖包版本更新提醒。
8.一种依赖分析的优化装置,其特征在于,所述装置包括:
扫描模块,用于扫描并读取软件项目中的目标文件;
生成模块,用于根据读取到的依赖项生成依赖分析文件,其中,所述依赖项包括所指示的依赖包的相关信息;
定位提取模块,用于定位所述依赖项中的动态变量代码,提取所述动态变量代码中的动态变量;
查找模块,用于在对应的匹配文件中查找所述动态变量所对应的变量取值;
替换模块,用于利用所述变量取值替换所述依赖分析文件中对应的动态变量代码。
9.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机可读指令,其特征在于,所述处理器执行所述计算机可读指令时执行如权利要求1-7任一项所述的方法的步骤。
10.一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机可读指令,其特征在于,所述计算机可读指令被处理器执行时,使得所述处理器执行如权利要求1-7任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210936938.9A CN115268991A (zh) | 2022-08-05 | 2022-08-05 | 依赖分析的优化方法、装置、设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210936938.9A CN115268991A (zh) | 2022-08-05 | 2022-08-05 | 依赖分析的优化方法、装置、设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115268991A true CN115268991A (zh) | 2022-11-01 |
Family
ID=83748429
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210936938.9A Pending CN115268991A (zh) | 2022-08-05 | 2022-08-05 | 依赖分析的优化方法、装置、设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115268991A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115543410A (zh) * | 2022-11-29 | 2022-12-30 | 深圳开源互联网安全技术有限公司 | 组件依赖关系分析方法、装置与介质 |
CN115934157A (zh) * | 2022-12-28 | 2023-04-07 | 中国人民解放军国防科技大学 | 软件依赖范围自动推断方法、装置、计算机设备和存储器 |
CN117369865A (zh) * | 2023-12-07 | 2024-01-09 | 麒麟软件有限公司 | 一种GNU linux通用的应用程序打包方法及图形化应用打包器 |
-
2022
- 2022-08-05 CN CN202210936938.9A patent/CN115268991A/zh active Pending
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115543410A (zh) * | 2022-11-29 | 2022-12-30 | 深圳开源互联网安全技术有限公司 | 组件依赖关系分析方法、装置与介质 |
CN115934157A (zh) * | 2022-12-28 | 2023-04-07 | 中国人民解放军国防科技大学 | 软件依赖范围自动推断方法、装置、计算机设备和存储器 |
CN115934157B (zh) * | 2022-12-28 | 2024-04-16 | 中国人民解放军国防科技大学 | 软件依赖范围自动推断方法、装置、计算机设备和存储器 |
CN117369865A (zh) * | 2023-12-07 | 2024-01-09 | 麒麟软件有限公司 | 一种GNU linux通用的应用程序打包方法及图形化应用打包器 |
CN117369865B (zh) * | 2023-12-07 | 2024-04-05 | 麒麟软件有限公司 | 一种GNU linux通用的应用程序打包方法及图形化应用打包器 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN115268991A (zh) | 依赖分析的优化方法、装置、设备和存储介质 | |
CN108804159B (zh) | javascript模块加载方法及其预处理方法、装置和计算机设备 | |
CN111324619B (zh) | 微服务系统中的对象更新方法、装置、设备和存储介质 | |
CN111638873A (zh) | 程序代码的生成方法、装置、计算机设备及存储介质 | |
CN110765741A (zh) | 数据处理的方法、装置、计算机设备和存储介质 | |
WO2021022703A1 (zh) | 软件项目重构方法、装置、计算机装置及存储介质 | |
US20210026756A1 (en) | Deriving software application dependency trees for white-box testing | |
CN115794214B (zh) | 应用模块元数据管理方法、设备、存储介质及装置 | |
CN115525534A (zh) | 基于swagger的接口测试的测试用例生成方法、生成平台 | |
CN113220577A (zh) | 基于云计算的软件测试任务测试方法及系统 | |
CN114816772B (zh) | 基于兼容层运行的应用的排错方法、排错系统及计算设备 | |
CN115795193A (zh) | 页面数据提取方法、页面自动化测试方法 | |
CN113626108A (zh) | webpack的辅助配置方法、装置、设备和存储介质 | |
CN115629763A (zh) | 目标代码的生成方法、npu指令的显示方法及装置 | |
CN113821213A (zh) | 基于人工智能的前端代码检测及修复方法、装置及设备 | |
CN115129598A (zh) | 一种sql语句的风险检测方法、装置、系统及介质 | |
CN114895914A (zh) | 日志输出代码的生成方法、装置、电子设备及存储介质 | |
CN114611500A (zh) | 表达式处理方法、装置、电子设备及计算机可读存储介质 | |
CN112799697A (zh) | 一种基于标准框架的配置文件版本迁移方法 | |
CN109299004B (zh) | 关键元素差异性分析方法及系统 | |
CN113821251A (zh) | 基于人工智能的代码优化方法、装置、设备和存储介质 | |
CN113408250B (zh) | 一种项目文件的处理方法和装置 | |
CN114416104B (zh) | 一种结构化数据文件处理方法及装置 | |
CN111045657B (zh) | 程序代码的运行方法和运行装置以及编译方法和编译装置 | |
CN116880826B (zh) | 一种可视化代码生成方法 |
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 |