我已经获得了一些部署的Perl脚本。
查找和安装这些脚本使用的所有模块的最简单方法是什么?
修改
据我所知,evals中没有条件包含或包含。
答案 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::ScanDeps的scandeps.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为您工作,在一个可执行文件中收集您需要的所有内容。