幽灵依赖的处理方法、装置、电子设备及可读存储介质与流程

文档序号:31714555发布日期:2022-10-04 21:13阅读:332来源:国知局
幽灵依赖的处理方法、装置、电子设备及可读存储介质与流程

1.本发明实施例涉及计算机技术领域,尤其涉及一种幽灵依赖的处理方法、装置、电子设备及可读存储介质。


背景技术:

2.yarn(yet another resource negotiator,另一种资源协调者)是一种新的hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。npm的全称是node package manager,是一个nodejs包管理和分发工具,已经成为了非官方的发布node模块(包)的标准。npm具有多个版本。
3.pnpm(performant npm,高性能的npm),pnpm是一个速度快、磁盘空间大的软件包管理器。pnpm 使用内容可寻址文件系统将所有模块目录中的所有文件存储在磁盘上。
4.软件包由yarn资源管理器切换至pnpm资源管理器或由npm资源管理器切换至pnpm资源管理器时易发生幽灵依赖,幽灵依赖造成系统运行的稳定性差。而幽灵依赖难以被开发者获知的特性(存在幽灵依赖的情况下,系统可能依然能够运行),使得排除幽灵依赖十分困难。目前,幽灵依赖的需要人工排除,排除效率低,排除幽灵依赖耗费的时间成本和人员薪资成本巨大。


技术实现要素:

5.本发明实施例提供一种幽灵依赖的处理方法、装置、电子设备及可读存储介质,以解决现有的幽灵依赖的需要人工排除,排除效率低,排除幽灵依赖耗费的时间成本和人员薪资成本巨大的问题。
6.为了解决上述技术问题,本发明是这样实现的:第一方面,本发明实施例提供了一种幽灵依赖的处理方法,包括:接收用户通过交互端发送的包名称,将所述包名称处理为数组形式;根据数组形式的所述包名称对第一资源管理器中的文件包是否具有目标版本号进行查询,所述目标版本号为pnpm资源管理器中的package.json文件未声明依赖的版本号;若所述查询的查询结果为具有目标版本号,将所述目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖所述目标版本号。
7.可选地,根据数组形式的所述包名称对第一资源管理器中的文件包是否具有目标版本号进行查询,之后包括:若所述查询的查询结果为不具有所述目标版本号,获取所述包名称的最新版本号,将所述最新版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖所述最新版本号。
8.可选地,将所述目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖所述目标版本号,之前包括:对所述查询结果进行第一核验,所述第一核验用于指示所述目标版本号的数量是否超出预设的数量阈值;若所述第一核验的核验结果为所述目标版本号的数量超出所述预设的数量阈值,从第一资源管理器中的根目录文件包获取与包名称对应的目标文件包;提取所述目标文件包的package.json文件中的版本号为所述目标版本号。
9.可选地,所述预设的数量阈值为1。
10.可选地,将所述目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖所述目标版本号,之后包括:采用pnpm安装目标版本号的项目依赖。
11.可选地,所述第一资源管理器包括以下至少一种资源管理器:yarn资源管理器、npmv3资源管理器、npmv4资源管理器、npmv5资源管理器、npmv6资源管理器、npmv7资源管理器以及npmv8资源管理器。
12.第二方面,本发明实施例提供了一种幽灵依赖的处理装置,包括:接收模块,用于接收用户通过交互端发送的包名称,将所述包名称处理为数组形式;查询模块,用于根据数组形式的所述包名称对第一资源管理器中的文件包是否具有目标版本号进行查询,所述目标版本号为pnpm资源管理器中的package.json文件未声明依赖的版本号;执行模块,用于若所述查询的查询结果为具有目标版本号,将所述目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖所述目标版本号。
13.可选地,所述执行模块,还用于若所述查询的查询结果为不具有所述目标版本号,获取所述包名称的最新版本号,将所述最新版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖所述最新版本号。
14.第三方面,本发明实施例提供了一种电子设备,包括处理器,存储器及存储在所述存储器上并可在所述处理器上运行的程序或指令,所述程序或指令被所述处理器执行时实现如第一方面中任一项所述的幽灵依赖的处理方法中的步骤。
15.第四方面,本发明实施例提供了一种可读存储介质,所述可读存储介质上存储程序或指令,所述程序或指令被处理器执行时实现如第一方面中任一项所述的幽灵依赖的处理方法中的步骤。
16.在本发明实施例中,通过根据数组形式的所述包名称对第一资源管理器中的文件包是否具有目标版本号进行查询,若查询的查询结果为具有目标版本号,将目标版本号存
储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖目标版本号,实现了对幽灵依赖的高效排除,节约了排除幽灵依赖耗费的时间成本和人员薪资成本。
附图说明
17.通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:图1为幽灵依赖的示意图之一;图2为幽灵依赖的示意图之二;图3为幽灵依赖的示意图之三;图4为幽灵依赖的示意图之四;图5为幽灵依赖的示意图之五;图6为幽灵依赖的示意图之六;图7为本发明实施例幽灵依赖的处理方法的流程示意图之一;图8为应用本发明实施例幽灵依赖的处理方法的处理示意图;图9为本发明实施例幽灵依赖的处理方法的流程示意图之二;图10为本发明实施例幽灵依赖的处理装置的原理框图;图11为本发明实施例电子设备的原理框图。
具体实施方式
18.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
19.pnpm与yarn相比具有以下优点:依赖安装速度更快;磁盘利用率更高;资源依赖结构更稳定。将yarn前端项目切换为pnpm项目,是在利用pnpm的上述优势的情况下,减少切换过程中繁琐的幽灵依赖处理操作,能够稳定、高效、顺畅的切换。
20.幽灵依赖(phantom dependencies),即某个包没有被安装(package.json中并没有,但是用户却能够引用到这个包)。
21.这个现象一般是node_modules结构造成的,例如使用yarn对项目安装依赖,依赖里面有个依赖叫做foo,foo这个依赖同时依赖了bar,yarn会对安装的node_modules做一个扁平化结构的处理(npmv3之后也是这么做的),会把依赖在node_modules下打平,这样相当于foo和bar出现在同一层级下面。那么根据nodejs的寻径原理,用户能require到foo,同样也能require到bar。
22.示例性的,参见图1所示,项目package.json只声明依赖了 antd@4.21.0 和 react@16.13.0。参见图2所示,antd@4.21.0依赖了react-dom @17.0.0 和 remark@14.0.1。package.json项目声明在yarn管理依赖时产生如图3所示的目录结构,即项目本身依赖的antd@4.21.0和react@16.13.0,以及antd@4.21.0本身依赖的react-dom@17.0.0和remark@14.0.1是在同一层级结构下扁平化管理的。
23.开发者可以引用react-dom@17.0.0加以使用,但项目本身package.json并未声明这个依赖,此种情况下,react-dom@17.0.0就是幽灵依赖。
24.对于幽灵依赖的危害,示例性的,参见图4所示,项目中依赖react-dom@17.0.0的antd@4.21.0升级至了antd@6.2.0。然而,参见图5所示,antd@6.2.0依赖的react-dom已为@21.0.0版本。参见图6所示,开发者只针对antd的升级做了相应的语法升级,而对于依赖react-dom的代码没有针对性变更。因为react-dom是幽灵依赖,它的升级并不为开发者感知(存在幽灵依赖的情况下,系统可能依然能够运行),所以react-dom版本由@17.0.0升级为@21.0.0会造成运行不稳定,这便是幽灵依赖的危害。
25.本发明实施例提供了一种幽灵依赖的处理方法,参见图7所示,图7为本发明实施例幽灵依赖的处理方法的流程示意图之一,包括:步骤11:接收用户通过交互端发送的包名称,将包名称处理为数组形式;步骤12:根据数组形式的包名称对第一资源管理器中的文件包是否具有目标版本号进行查询,目标版本号为pnpm资源管理器中的package.json文件未声明依赖的版本号;步骤13:若查询的查询结果为具有目标版本号,将目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖目标版本号。
26.本发明实施例中,目标版本号为pnpm资源管理器中的package.json文件未声明依赖的版本号,即表示与目标版本号对应的文件包造成了幽灵依赖。
27.示例性的,参见图8所示,其中流程二即为幽灵依赖的处理步骤,具体地,以第一资源管理器为yarn资源管理器为例进行说明:2.1接收用户输入的*${pkgname}参数(相当于本发明实施例中的接收用户通过交互端发送的包名称);2.2根据"{空格}|{空格}"切割参数,处理为数组:peerlist(相当于本发明实施例中的将包名称处理为数组形式);2.3根据用户输入的peerlist匹配yarn环境下peerpackage的版本号,并将相应的version记录保存至package.json中(相当于本发明实施例中的根据数组形式的包名称对第一资源管理器中的文件包是否具有目标版本号进行查询,若查询的查询结果为具有目标版本号,将目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖目标版本号)。
28.在本发明实施例中,通过根据数组形式的包名称对第一资源管理器中的文件包是否具有目标版本号进行查询,若查询的查询结果为具有目标版本号,将目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖目标版本号,实现了对幽灵依赖的高效排除,节约了排除幽灵依赖耗费的时间成本和人员薪资成本。
29.本发明的一些实施例中,可选地,根据数组形式的包名称对第一资源管理器中的文件包是否具有目标版本号进行查询,之后包括:若查询的查询结果为不具有目标版本号,获取包名称的最新版本号,将最新版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖最新版本号。
30.示例性的,参见图8所示,其中流程二即为幽灵依赖的处理步骤,具体地,以第一资源管理器为yarn资源管理器为例进行说明:
2.1接收用户输入的*${pkgname}参数(相当于本发明实施例中的接收用户通过交互端发送的包名称);2.2根据"{空格}|{空格}"切割参数,处理为数组:peerlist(相当于本发明实施例中的将包名称处理为数组形式);2.3根据用户输入的peerlist匹配yarn环境下peerpackage的版本号,并将相应的version记录保存至package.json中(相当于本发明实施例中的根据数组形式的包名称对第一资源管理器中的文件包是否具有目标版本号进行查询)。
31.其中,步骤2.3包括2.3.1于peerlist中逐一取出peername重复以下操作,直至处理完整个peerlist;2.3.2为peername追加@符号(yarn.lock特征)${peername}@以下简写为peer;2.3.3匹配yarn.lock中peer所在行,并检索下一行version"x.x.x",将该行versionline存储至versionlist中;2.3.4检查versionlist长度,若为0则进入步骤2.3.5(相当于本发明实施例中的若查询的查询结果为不具有目标版本号);2.3.5将"{peername}":"@latest"添加到package.json文件"dependencies"中"dependencies":{"{peername}":"@latest"}(相当于本发明实施例中的获取包名称的最新版本号,将最新版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖最新版本号)。
32.本发明实施例中,查询不到目标版本号,代表没有找到yarn资源管理器的项目下针对包名称的版本声明,原因可能是yarn资源管理器意外损坏或者yarn资源管理器被人为改过的情况。将最新版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖最新版本号,能够排除yarn资源管理器意外损坏或者yarn资源管理器被人为改过对pnpm资源管理器的消极影响,有利于避免在后续过程中发生幽灵依赖。
33.本发明的一些实施例中,可选地,参见图9所示,图9为本发明实施例幽灵依赖的处理方法的流程示意图之二,将目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖目标版本号,之前包括:步骤21:对查询结果进行第一核验,第一核验用于指示目标版本号的数量是否超出预设的数量阈值;步骤22:若第一核验的核验结果为目标版本号的数量超出预设的数量阈值,从第一资源管理器中的根目录文件包获取与包名称对应的目标文件包;步骤23:提取目标文件包的package.json文件中的版本号为目标版本号。
34.长度大于预设的数量阈值是常见情况,比如:react依赖了react-dom@2.1.1,antd依赖了react-dom@2.3.3

那么脚本查找到的结果将会是两个以上。
35.示例性的,参见图8所示,其中流程二即为幽灵依赖的处理步骤,具体地,以第一资源管理器为yarn资源管理器为例进行说明:2.1接收用户输入的*${pkgname}参数(相当于本发明实施例中的接收用户通过交互端发送的包名称);
2.2根据"{空格}|{空格}"切割参数,处理为数组:peerlist(相当于本发明实施例中的将包名称处理为数组形式);2.3根据用户输入的peerlist匹配yarn环境下peerpackage的版本号,并将相应的version记录保存至package.json中(相当于本发明实施例中的根据数组形式的包名称对第一资源管理器中的文件包是否具有目标版本号进行查询,若查询的查询结果为具有目标版本号,将目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖目标版本号)。
36.其中,步骤2.3包括:2.3.1于peerlist中逐一取出peername重复以下操作,直至处理完整个peerlist;2.3.2为peername追加@符号(yarn.lock特征)${peername}@以下简写为peer;2.3.3匹配yarn.lock中peer所在行,并检索下一行version"x.x.x",将该行versionline存储至versionlist中;2.3.4检查versionlist长度,若大于1则进入步骤2.3.7(相当于本发明实施例中将目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖目标版本号,之前包括:对查询结果进行第一核验,第一核验用于指示目标版本号的数量是否超出预设的数量阈值;若第一核验的核验结果为目标版本号的数量超出预设的数量阈值)。
37.2.3.7yarn.lock中peerversion不唯一,读取项目根目录下node_moudels目录下peername目录peerfolder;读取peerfolder目录下package.json文件下"version":"{peerversion}","version"所在行冒号后引号内内容;peerversion={peerversion};将"{peername}":"^{peerversion}"添加到package.json文件"dependencies"中"dependencies":{"{peername}":"^{peerversion}"}(相当于本发明实施例中的若第一核验的核验结果为目标版本号的数量超出预设的数量阈值,从第一资源管理器中的根目录文件包获取与包名称对应的目标文件包;提取目标文件包的package.json文件中的版本号为目标版本号)。
38.本发明实施例中,可选地,预设的数量阈值为1。
39.本发明的一些实施例中,可选地,将所述目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖所述目标版本号,之后包括:采用pnpm安装目标版本号的项目依赖。
40.示例性的,参见图8所示,其中流程二即为幽灵依赖的处理步骤,具体地,以第一资源管理器为yarn资源管理器为例进行说明:2.1接收用户输入的*${pkgname}参数(相当于本发明实施例中的接收用户通过交互端发送的包名称);2.2根据"{空格}|{空格}"切割参数,处理为数组:peerlist(相当于本发明实施例中的将包名称处理为数组形式);2.3根据用户输入的peerlist匹配yarn环境下peerpackage的版本号,并将相应
的version记录保存至package.json中(相当于本发明实施例中的根据数组形式的包名称对第一资源管理器中的文件包是否具有目标版本号进行查询,若查询的查询结果为具有目标版本号,将目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖目标版本号);2.4peerlist处理完毕,执行pnpminstall(相当于本发明实施例中的采用pnpm安装目标版本号的项目依赖);2.5程序执行完毕,流程结束。
41.目标版本号插入到package.json中之后,package.json只是项目所依赖的包的显示声明文件,只是缺少的包声明补全了,但是node_moudels目录下并未安装,执行pnpminstall是用pnpm安装项目依赖。
42.本发明的一些实施例中,可选地,第一资源管理器包括以下至少一种资源管理器:yarn资源管理器、npmv3资源管理器、npmv4资源管理器、npmv5资源管理器、npmv6资源管理器、npmv7资源管理器以及npmv8资源管理器。
43.npm的全称是nodepackagemanager,是一个nodejs包管理和分发工具,已经成为了非官方的发布node模块(包)的标准。npm具有多个版本。
44.本发明实施例中,npmv3即为npm的第3版本。
45.npmv4资源管理器、npmv5资源管理器、npmv6资源管理器、npmv7资源管理器以及npmv8资源管理器,即为npm的第4版本至第8版本。
46.示例性的,参见图8所示,其中流程二即为幽灵依赖的处理步骤,具体地包括:2.1接收用户输入的*${pkgname}参数(相当于本发明实施例中的接收用户通过交互端发送的包名称);2.2根据"{空格}|{空格}"切割参数,处理为数组:peerlist(相当于本发明实施例中的将包名称处理为数组形式);2.3检查所切换项目为yarn环境还是npmv3以上环境;检查依据为:yarn环境:项目存在yarn.lock文件;npmv3环境:项目存在package-lock.json文件,且npm-v检查版本大于3;若两者都存在弹出用户确认提示,用户选择以哪个为基准切换。
47.2.4若2.3中检查结果为yarn环境,根据用户输入的peerlist匹配yarn环境下peerpackage的版本号,并将相应的version记录保存至package.json中(相当于本发明实施例中的根据数组形式的包名称对第一资源管理器中的文件包是否具有目标版本号进行查询,若查询的查询结果为具有目标版本号,将目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖目标版本号)。
48.本发明实施例提供了一种幽灵依赖的处理装置,参见图10所示,图10为本发明实施例幽灵依赖的处理装置的原理框图,幽灵依赖的处理装置100包括:接收模块101,用于接收用户通过交互端发送的包名称,将所述包名称处理为数组形式;查询模块102,用于根据数组形式的所述包名称对第一资源管理器中的文件包是
否具有目标版本号进行查询,所述目标版本号为pnpm资源管理器中的package.json文件未声明依赖的版本号;执行模块103,用于若所述查询的查询结果为具有目标版本号,将所述目标版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖所述目标版本号。
49.本发明的一些实施例中,可选地,所述执行模块103,还用于若所述查询的查询结果为不具有所述目标版本号,获取所述包名称的最新版本号,将所述最新版本号存储至pnpm资源管理器中的package.json文件,使得package.json文件声明依赖所述最新版本号。
50.本发明的一些实施例中,可选地,所述执行模块103,还用于对所述查询结果进行第一核验,所述第一核验用于指示所述目标版本号的数量是否超出预设的数量阈值;所述执行模块103,还用于若所述第一核验的核验结果为所述目标版本号的数量超出所述预设的数量阈值,从第一资源管理器中的根目录文件包获取与包名称对应的目标文件包;所述执行模块103,还用于提取所述目标文件包的package.json文件中的版本号为所述目标版本号。
51.本技术实施例提供的幽灵依赖的处理装置能够实现图1至图9的方法实施例实现的各个过程,并达到相同的技术效果,为避免重复,这里不再赘述。
52.本发明实施例提供了一种电子设备110,参见图11所示,图11为本发明实施例电子设备110的原理框图,包括处理器111,存储器112及存储在存储器112上并可在处理器111上运行的程序或指令,程序或指令被处理器执行时实现本发明的任一项幽灵依赖的处理方法中的步骤。
53.本发明实施例提供了一种可读存储介质,可读存储介质上存储程序或指令,程序或指令被处理器执行时实现如上述任一项的幽灵依赖的处理方法的实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
54.其中,所述的可读存储介质,如只读存储器(read-onlymemory,简称rom)、随机存取存储器(randomaccessmemory,简称ram)、磁碟或者光盘等。
55.上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,均属于本发明的保护之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1