如何查找Perl脚本中使用的所有模块并进行安装?

时间:2009-08-20 08:26:36

标签: perl perl-module

我已经获得了一些部署的Perl脚本。

查找和安装这些脚本使用的所有模块的最简单方法是什么?

修改

据我所知,evals中没有条件包含或包含。

4 个答案:

答案 0 :(得分:10)

我的Module::Extract::Use有帮助吗? examples 目录中有一个extract_modules program

$ examples/extract_modules -l some_program
 File::Spec
 File::Spec::Functions
 strict
 warning

您可以将该列表发送到cpan

$ examples/extract_modules -l some_program | xargs cpan

一旦你有了那个只是第一级依赖关系的列表,你可以创建一个script distribution,允许人们使用普通的CPAN工具链来安装所有东西。

如果某些内容对您不起作用,请修改程序以处理该问题。如果您认为对其他人有用,请发送拉取请求。 :)

答案 1 :(得分:3)

我希望提供命令行实用程序Module::ScanDepsscandeps.pl在这里很有用,但令我沮丧的是,Module::ScanDeps显然不是针对此特定目的的scandeps.pl当脚本使用未安装的模块时,要么忽略缺少的模块,要么忽略(-c-x)。

这是一个quick'n'dirty Perl脚本,尝试使用do执行脚本,直到成功为止:

#!/usr/bin/perl

use strict;
use warnings;

use Term::Prompt;

my ($script) = @ARGV;

die "Provide script file name on the command line\n"
    unless defined $script;

until ( do $script ) {
    my $ex = $@;
    if ( my ($file) = $ex =~ /^Can't locate (.+?) in/ ) {
        my $module = $file;
        $module =~ s/\.(\w+)$//;
        $module = join('::', split '/', $module);
        print "Attempting to install '$module' via cpan\n";
        system(cpan => $module);
        last unless prompt(y => 'Try Again?', '', 'n');
    }
    else {
        die $ex;
    }
}

如果您不想运行脚本,可以运行perl -c $script,捕获stderr输出并解析丢失的模块消息,并为找到的每个此类模块调用cpan直到perl -c $script输出“语法OK”。这也给你一个更清洁的循环。我稍后再看看。

您可能会错过使用此技术在运行时加载的依赖项。

答案 2 :(得分:1)

这是非常简单的方式我解决了这个问题。

在bash shell中:

cat *.pl  | grep "^use " | tr ';' ' ' | while read a b c; do echo $b; done | sort -iu > modules.txt 

这给了我一个只有模块名称的文件,每行一个。

然后我用了这个

cat modules.txt | while read a; do cpan $a; done 

调用cpan到文件中的每个模块名称。然后坐在那里对CPAN的问题回答是,以便在适当的时候安装依赖项。

不漂亮,但这一次完成了工作。

答案 3 :(得分:0)

或者让PAR's pp为您工作,在一个可执行文件中收集您需要的所有内容。