当前位置:  开发笔记 > 编程语言 > 正文

如何找到Perl脚本的模块依赖项?

如何解决《如何找到Perl脚本的模块依赖项?》经验,为你挑选了4个好方法。

我希望另一个开发人员运行我编写的Perl脚本.该脚本使用许多必须在脚本运行之前安装的CPAN模块.是否可以使脚本(或perl二进制文件)转储所有缺少的模块的列表?当我尝试运行脚本时,Perl会打印出缺少的模块的名称,但这很详细,并且不会立即列出所有缺少的模块.我想做点什么:

$ cpan -i `said-script --list-deps`

甚至:

$ list-deps said-script > required-modules # on my machine
$ cpan -i `cat required-modules` # on his machine

有一个简单的方法吗?这不是一个显示阻止,但我想让其他开发人员的生活更轻松.(所需的模块分散在几个文件中,因此我不容易手工制作列表而不会遗漏任何内容.我知道PAR,但对于我想要的东西来说似乎有点太复杂了.)


更新:谢谢,曼尼,这样做.我不知道%INC,我只知道@INC.我解决了这样的事情:

print join("\n", map { s|/|::|g; s|\.pm$||; $_ } keys %INC);

打印出来:

Moose::Meta::TypeConstraint::Registry
Moose::Meta::Role::Application::ToClass
Class::C3
List::Util
Imager::Color
…

看起来这样可行.



1> tsee..:

查看Module :: ScanDeps以及随附的"scandeps.pl"实用程序.它可以在编译或运行程序之后对依赖项的代码以及%INC转储进行静态(和递归)分析.

请注意,静态源扫描总是错误地包含太多依赖项.(它是PAR使用的依赖扫描程序,旨在最终用户最简单.)

最后,您可以选择将脚本分发为CPAN分发.这听起来比实际复杂得多.您可以使用Module :: Starter之类的东西来设置试验性App :: YourScript发行版的基本框架.将您的脚本放在bin /子目录中,然后编辑Makefile.PL以引用所有直接依赖项.然后,为了分发你做:

    perl Makefile.PL

    使

    使dist

最后一步生成一个很好的App-YourScript-VERSION.tar.gz现在,当客户端想要安装所有依赖项时,他会执行以下操作:

    正确设置CPAN客户端.只需运行它并回答问题.但无论如何你已经要求了.

    "tar -xz App-YourScript-VERSION.tar.gz && cd App-YourScript-VERSION"

    运行"cpan".

CPAN客户端现在将自动安装所有直接依赖项和这些发行版的依赖项.根据您的设置方式,它将自动递归地遵循先决条件,或者每次都使用ay/n进行提示.

作为一个例子,您可以在CPAN上查看一些App ::*发行版.我认为App :: Ack就是一个很好的例子.也许我的CPAN目录(SMUELLER)中的一个App ::*发行版.



2> innaM..:

您可以%INC在脚本的末尾转储.它将包含所有已使用和必需的模块.但是,当然,只有在您不需要有条件的模块时才会有所帮助(如果$ bar需要Foo).



3> brian d foy..:

对于快速,肮脏,不经常使用,这%INC是最好的方法.如果您必须使用持续集成测试或更强大的功能,还有一些其他工具可以提供帮助.

Steffen已经提到了Module :: ScanDeps.

Test :: Prereq中的代码执行此操作,但它有一个额外的层,可确保您的Makefile.PL或Build.PL将它们列为依赖项.如果您使脚本看起来像普通的Perl发行版,那么可以很容易地检查新的依赖项; 再次运行测试套件.

除此之外,您可以使用Module :: Extract :: Use之类的工具,它解析静态代码以查找use和require语句(尽管它不会在字符串evals中找到它们).这样就可以获得您告诉脚本加载的模块.此外,一旦您知道加载了哪些模块,就可以将其与David Cantrell的CPANdeps工具相结合,该工具已经为大多数CPAN模块创建了依赖关系树.

请注意,您还必须考虑可选功能.在这种情况下,您的代码我没有它们,但有时您在需要之前不会加载模块:

sub foo
    {
    require Bar; # don't load until we need to use it
    ....
    }

如果您在试运行或测试中未使用该功能,则不会看到该功能需要Bar.当模块在不同的环境(例如,mod_perl或Windows等)中加载不同的依赖模块集时,会出现类似的问题.

没有一种好的,自动化的方法来测试这样的可选功能,因此您可以获得它们的依赖项.但是,我认为这应该是我的待办事项列表,因为它听起来像一个有趣的问题.



4> rjbs..:

此区域中的另一个工具是Dist :: NereqScanner,它由Dist :: Zilla及其AutoPrereqs插件使用.它安装了一个scan-perl-prereqs程序,它将使用PPI和一些插件来搜索大多数类型的prereq声明,使用您定义的最小版本.一般来说,我建议过扫描%INC,这会带来虚假的要求并忽略版本.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有