我得到了一些要部署的 Perl 脚本。
查找和安装这些脚本使用的所有模块的最简单方法是什么?
编辑:
据我所知,eval 中没有条件包含或包含。
我的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 工具链来安装所有东西。
如果有些东西对您不起作用,请修改程序以处理它。如果您认为它对其他人有用,请发送拉取请求。:)
我希望提供命令行实用程序 scandeps.pl 的Module :: ScanDeps在这里有用,但令我沮丧的是,它显然不是为了这个特定目的,因为当脚本使用未安装的模块。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”。这也给了你一个更干净的循环。我稍后会看这个。
您可能会错过使用此技术在运行时加载的依赖项。
好吧,这是我解决这个问题的非常简单的方法。
在 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 的问题回答“是”,以酌情安装依赖项。
不漂亮,但这次它完成了工作。
或者让PAR 的 pp为您完成工作,将您需要的所有内容收集到一个可执行文件中。