8

我得到了一些要部署的 Perl 脚本。

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

编辑:

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

4

4 回答 4

12

我的Module::Extract::Use有帮助吗?在示例目录中有一个extract_modules程序:

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

您可以将该列表通过管道传输到cpan.

$ examples/extract_modules -l some_program | xargs cpan

一旦你有了这个列表,它只是第一级依赖项,你可以制作一个脚本分发,允许人们使用普通的 CPAN 工具链来安装所有东西。

如果有些东西对您不起作用,请修改程序以处理它。如果您认为它对其他人有用,请发送拉取请求。:)

于 2009-08-21T15:32:23.227 回答
3

我希望提供命令行实用程序 scandeps.pl 的Module :: ScanDeps在这里有用,但令我沮丧的是,它显然不是为了这个特定目的,因为当脚本使用未安装的模块。Module::ScanDepsscandeps.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”。这也给了你一个更干净的循环。我稍后会看这个。

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

于 2009-08-20T11:02:33.107 回答
2

好吧,这是我解决这个问题的非常简单的方法。

在 bash 外壳中:

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 的问题回答“是”,以酌情安装依赖项。

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

于 2009-08-20T09:11:31.647 回答
0

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

于 2009-08-20T11:14:24.393 回答