如何查看特定 Perl 模块所需的所有模块?

Posted

技术标签:

【中文标题】如何查看特定 Perl 模块所需的所有模块?【英文标题】:How can I see all modules that a specific Perl module requires? 【发布时间】:2021-06-13 23:10:03 【问题描述】:

假设我得到了一个像 Data::Validate::IP 这样的模块,我想查看所有需要的模块 (uses),我该怎么做?我正在审核一个模块的依赖项。

【问题讨论】:

@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 来提取在特定情况下出现的命名空间(userequirebaseparent)。不过,字面的裸词需要在那里。

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 模块所需的所有模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定特定 win32 api 调用所需的 windows 库?

Perl - 如何查看Perl模块路径

perl中的位选择

如何使 windeployqt 仅包含所需的模块?

如何使用脚本在 python 中安装特定版本的模块/库

使用模块和计数时如何在 terraform 中包含标签