【问题标题】:How can I see all modules that a specific Perl module requires?如何查看特定 Perl 模块所需的所有模块?
【发布时间】: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] 更合适。

标签: perl module include trace audit


【解决方案1】:

这些服务可以显示你声明的依赖关系:

  • MetaCPAN 显示模块的依赖关系列表。它还显示了“反向依赖”,因此您可以查看使用模块的内容。

  • CPAN Dependency Graphs 会以图片的形式显示依赖信息。

  • 我经常查看%INC 的结果,它显示了加载的内容(但不是由谁加载的)。这在试图获得 100% 的测试覆盖率以知道你得到了大多数东西时很方便。但是,除非代码使用它们,否则这仍然不会选择可选或动态模块。

CPAN::Dependenciescpandeps 工具也很方便:

$ 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::ClientModule::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',虽然这不会给你一棵整齐的树。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    • 2019-02-01
    • 2012-10-19
    相关资源
    最近更新 更多