如何查看特定 Perl 模块所需的所有模块?
Posted
技术标签:
【中文标题】如何查看特定 Perl 模块所需的所有模块?【英文标题】:How can I see all modules that a specific Perl module requires? 【发布时间】:2021-06-13 23:10:03 【问题描述】:假设我得到了一个像 Data::Validate::IP
这样的模块,我想查看所有需要的模块 (use
s),我该怎么做?我正在审核一个模块的依赖项。
【问题讨论】:
@Braiam 之所以需要module,是因为这里的目标是跟踪特定模块所做的导入。不是因为我在寻找 for 一个模块。 该标签不会添加任何未包含在标题中的内容。你不需要用标签写标题。如果有人知道 Python 模块,他们将无法回答问题,与其他标签相同。另一方面,Perl 对这个问题非常关键。 @Braiam 标签的目的是增加可搜索性。这样我就可以搜索[perl] + [audit]
等或[module] + [perl] dependencies
并找到问题。
“标签的目的是增加可搜索性” [需要引用] 事实上,我会告诉你标签的目的:Tags are a means of connecting experts with questions they will be able to answer by sorting questions into specific, well-defined categories. 这些都不是关于可搜索性的。搜索引擎使用关键字而不是标签。
@Braiam 引用在您的链接中命名标签时,请考虑某人将如何搜索该主题。在大多数情况下,这意味着输入出全名,但您可能还想使用缩写。例如,[css] 可能比我提供的示例 [cascading-style-sheets] 更合适。
【参考方案1】:
这些服务可以显示你声明的依赖关系:
MetaCPAN 显示模块的依赖关系列表。它还显示了“反向依赖”,因此您可以查看使用模块的内容。
CPAN Dependency Graphs 会以图片的形式显示依赖信息。
我经常查看%INC
的结果,它显示了加载的内容(但不是由谁加载的)。这在试图获得 100% 的测试覆盖率以知道你得到了大多数东西时很方便。但是,除非代码使用它们,否则这仍然不会选择可选或动态模块。
CPAN::Dependencies 的 cpandeps
工具也很方便:
$ cpandeps Business::ISBN
Business::ISBN (dist: B/BD/BDFOY/Business-ISBN-3.006.tar.gz)
Business::ISBN::Data (dist: B/BD/BDFOY/Business-ISBN-Data-20210112.006.tar.gz)
Carp (dist: X/XS/XSAWYERX/Carp-1.50.tar.gz)
Exporter (dist: T/TO/TODDR/Exporter-5.74.tar.gz)
IPC::Open3 (dist: S/SH/SHAY/perl-5.32.1.tar.gz)
Test::More (dist: E/EX/EXODIST/Test-Simple-1.302183.tar.gz)
File::Temp (dist: E/ET/ETHER/File-Temp-0.2311.tar.gz)
File::Path (dist: J/JK/JKEENAN/File-Path-2.18.tar.gz)
File::Spec::Functions (dist: X/XS/XSAWYERX/PathTools-3.75.tar.gz)
Scalar::Util (dist: P/PE/PEVANS/Scalar-List-Utils-1.55.tar.gz)
parent (dist: C/CO/CORION/parent-0.238.tar.gz)
Storable (dist: X/XS/XSAWYERX/Storable-3.15.tar.gz)
XSLoader (dist: S/SA/SAPER/XSLoader-0.24.tar.gz)
ExtUtils::MakeMaker (dist: B/BI/BINGOS/ExtUtils-MakeMaker-7.60.tar.gz)
Encode (dist: D/DA/DANKOGAI/Encode-3.08.tar.gz)
Pod::Man (dist: R/RR/RRA/podlators-4.14.tar.gz)
Pod::Simple (dist: K/KH/KHW/Pod-Simple-3.42.tar.gz)
Pod::Escapes (dist: N/NE/NEILB/Pod-Escapes-1.07.tar.gz)
Test (dist: J/JE/JESSE/Test-1.26.tar.gz)
Text::Wrap (dist: M/MU/MUIR/modules/Text-Tabs+Wrap-2013.0523.tar.gz)
if (dist: X/XS/XSAWYERX/if-0.0608.tar.gz)
还有各种静态分析工具:
我写了Module::Extract::Use 来提取在特定情况下出现的命名空间(use
、require
、base
、parent
)。不过,字面的裸词需要在那里。
MetaCPAN::Client 和Module::CoreList 可以通过多种方式配置信息。在这里,我得到了所有不是 perl 本身的运行时依赖项,也不是核心模块。不过,您可以过滤其他内容:
use v5.10;
use MetaCPAN::Client;
use Module::CoreList;
my $metacpan = MetaCPAN::Client->new;
my @queue = map [ 0, $_ ] @ARGV;
while( my $tuple = shift @queue )
state %Seen;
my $release = eval $metacpan->release( $tuple->[1] =~ s/::/-/gr ) ;
next unless $release;
say "\t" x $tuple->[0], $release->distribution,
defined $tuple->[2] ? " $tuple->[2]" : '';
push @queue,
map [ $tuple->[0] + 1, $_->module, $_->version ]
grep $_->module ne 'perl'
grep $_->phase eq 'runtime'
grep ! Module::CoreList::is_core( $_->module, undef, $^V )
grep ! $Seen $_->module ++
$release->dependency->@*;
【讨论】:
【参考方案2】:导入跟踪
您可以使用Devel::TraceUse
查看相关模块使用的所有模块,
perl -d:TraceUse -MData::Validate::IP -e1
请注意,它只测试编译时包含这样的内容,要查看它可能使用require
等引入的所有代码,请尝试实际运行代码,
perl -d:TraceUse -MData::Validate::IP -e'Data::Validate::IP::is_ipv4("1.2.3.4")'
示例输出
Modules used from -e:
1. Data::Validate::IP 0.27, -e line 0 [main]
2. strict 1.11, Data/Validate/IP.pm line 3
3. warnings 1.47, Data/Validate/IP.pm line 4
4. NetAddr::IP 4.079, Data/Validate/IP.pm line 10
5. Carp 1.50, NetAddr/IP.pm line 7
6. overloading 0.02, Carp.pm line 170
7. Exporter 5.74, Carp.pm line 224
18. Exporter::Heavy 5.74, Exporter.pm line 16
8. NetAddr::IP::Lite 1.57, NetAddr/IP.pm line 8
9. NetAddr::IP::InetBase 0.08, NetAddr/IP/Lite.pm line 17
10. vars 1.05, NetAddr/IP/InetBase.pm line 8
11. warnings::register 1.04, vars.pm line 7
12. AutoLoader 5.74, NetAddr/IP/InetBase.pm line 9
15. auto/NetAddr/IP/InetBase/AF_INET6.al, AutoLoader.pm line 34 (FAILED)
13. Socket 2.029, NetAddr/IP/InetBase.pm line 77
14. XSLoader 0.30, Socket.pm line 701
16. Socket6 0.29, NetAddr/IP/InetBase.pm line 85
17. base 2.27, Socket6.pm line 215
19. NetAddr::IP::Util 1.53, NetAddr/IP/Lite.pm line 31
20. NetAddr::IP::Util_IS 1, NetAddr/IP/Util.pm line 10
21. overload 1.31, NetAddr/IP/Lite.pm line 280
22. Scalar::Util 1.55, Data/Validate/IP.pm line 11
23. List::Util 1.55, Scalar/Util.pm line 23
Modules used, but not reported:
/usr/local/cpanel/3rdparty/perl/532/lib/perl5/cpanel_lib/x86_64-linux-64int/auto/NetAddr/IP/InetBase/autosplit.ix
/usr/local/cpanel/3rdparty/perl/532/lib/perl5/cpanel_lib/x86_64-linux-64int/auto/NetAddr/IP/InetBase/inet_any2n.al
/usr/local/cpanel/3rdparty/perl/532/lib/perl5/cpanel_lib/x86_64-linux-64int/auto/NetAddr/IP/InetBase/ipv6_aton.al
/usr/local/cpanel/3rdparty/perl/532/lib/perl5/cpanel_lib/x86_64-linux-64int/auto/NetAddr/IP/Util/autosplit.ix
/usr/local/cpanel/3rdparty/perl/532/lib/perl5/cpanel_lib/x86_64-linux-64int/auto/NetAddr/IP/autosplit.ix
【讨论】:
还有perl -MData::Validate::IP -E'say for sort keys %INC'
,虽然这不会给你一棵整齐的树。以上是关于如何查看特定 Perl 模块所需的所有模块?的主要内容,如果未能解决你的问题,请参考以下文章