Perl脚本检查Perl模块是否已安装

3
我希望能够在列表中的每个模块上运行此测试。 不确定如何让Perl循环遍历每个项目。
use Module::Load;
eval {
  load Image::Magick;
  1;
} or die "you need Module to run this program";
  • Bit::Vector(位向量)
  • Carp::Clan(Carp家族)
  • Check::ISA(检查ISA)
  • DBD::Oracle(Oracle数据库驱动程序)
  • DBI(数据库接口)
  • Data::GUID(全局唯一标识符)
  • Data::OptList(选项列表)
  • Data::TreeDumper(数据树转储)
  • Data::UUID(通用唯一标识符)
  • Date::Calc(日期计算)
  • Devel::Size(开发大小)
  • ExtUtils::MakeMaker(扩展工具MakeMaker)
  • Log::Dispatch(日志分发)
  • Log::Dispatch::File::Rolling(滚动文件日志分发)
  • Log::Dispatch::FileRotate(文件轮换日志分发)
  • Log::Log4perl(Log4perl日志)
  • Params::Util(参数工具)
  • Params::Validate(参数验证)
  • Sort::Naturally(自然排序)
  • Sub::Exporter(子导出器)
  • Sub::Install(子安装)
  • Sub::Uplevel(子级别)
  • Sys::Syslog(系统日志)
  • Term::Size(终端大小)
  • Test::Exception(测试异常)
  • Test::Simple(简单测试)
  • Test::use::ok(测试使用ok)
  • Tree::Simple(简单树)

2
看起来你在这里用了错误的方法解决问题。学习如何将你的应用程序打包为分发,并且只需在分发元文件中声明依赖关系。在安装时,依赖项将自动处理。 - daxim
可能是 https://dev59.com/gGDVa4cB1Zd3GeqPbTtF 或 https://dev59.com/AnRA5IYBdhLWcg3w2x0I 的重复问题。 - dgw
4个回答

6

可以尝试以下操作:

#!/usr/bin/perl 
use 5.010;
use strict;
use warnings;

my @modules = qw(
    Bit::Vector
    Carp::Clan
    Check::ISA
    DBD::Oracle
    DBI
    Tree::Simple
);

for(@modules) {
    eval "use $_";
    if ($@) {
        warn "Not found : $_" if $@;
    } else {
        say "Found : $_";
    }
}

3
如果您不需要使用Perl来完成这个任务,您可以使用shell脚本来实现:
#!/bin/sh
MODULES="Data::Dumper Foobar::Test"

for i in $MODULES ; do
  if $(perl -M$i -e '1;' >/dev/null 2>&1 ); do
    echo "Ok."
  else
    echo "No." 
  fi
done

除了使用echo,你还可以使用其他方法。

代码序列:

perl -MData::Dumper '1;'

将以错误值0(ok)退出

perl -MFoobar::Test '1;'

将以错误值2(发生错误)退出。


谢谢你的建议。当我运行你提供的语法时,我得到了以下结果:<br>perllist: 第6行:附近有意外的标记“do” <br>perllist: 第6行:`if $(perl -M$i -e '1;' >/dev/null 2>&1 ); do' - Matt Herzog
我认为我可能需要在MODULES列表中剥离引号和逗号。MODULES="'Bit::Vector', 'Derp::Derp', 'Carp::Clan', 'Check::ISA', 'DBD::Oracle', 'DBI Data::GUID', 'Data::OptList', 'Data::TreeDumper', 'Data::UUID', 'Date::Calc', 'Devel::Size', 'ExtUtils::MakeMaker', 'Log::Dispatch', 'Log::Dispatch::File::Rolling', 'Log::Dispatch::FileRotate', 'Log::Log4perl', 'Params::Util', 'Params::Validate', 'Sort::Naturally', 'Sub::Exporter', 'Sub::Install', 'Sub::Uplevel', 'Sys::Syslog', 'Term::Size', 'Test::Exception', 'Test::Simple', 'Test::use::ok', 'Tree::Simple'" - Matt Herzog

1

我想回应@daxim的评论,似乎你正在寻找制作模块的分发方式。对于这个问题,我建议使用Module::BuildDist::Zilla。我的几乎所有模块都使用这两种机制之一,所以如果你需要示例,请随意浏览我的GitHub。查找Build.PLdist.ini文件(分别用于M::B或D::Z)。


0

完整脚本

  # a around M42's answer with some more user-kindness ...
  use strict ; use warnings ; 
  use 5.10.0 ; 

  #  quick and dirty check for prerequisites perl modules:
  #  courtesy of:https://dev59.com/o2DVa4cB1Zd3GeqPepTK#9340304
  #  if you have a calling bash script call by :
  #  perl "/path/to/isg_pub_preq_cheker.pl"
  #  export ret=$?
  #  test $ret -ne 0 && doExit 1 "[FATAL] perl modules not found!!!"


  # check that all the required modules are installed
  my ( $ret , $msg ) = doCheckRequiredModules();

  unless ( $ret == 0 ) {
     print "$msg" ; 
     # give some time for the user to react
     sleep 7;
  }

  exit(0);

  sub doCheckRequiredModules {

     my @modules = qw(
        ExtUtils::MakeMaker
        Test::More
        Test::Deep
        File::Copy::Recursive
        HTML::TreeBuilder
        HTML::TreeBuilder::XPath
        HTML::TableExtract
        HTML::ElementTable
        Data::Printer
     );

     for(@modules) {
         eval "use $_";
         if ($@) {

           my $msg = "\n\n\n [FATAL] did not found the following perl module: $_ " ; 
           $msg .= "\n install it in the shell by running the following command:" ; 
           # if the user knows already the difference between the running the cmd 
           # with sudo or he / she probably knows already how-to install perl modules
           $msg .= "\n sudo perl -MCPAN -e 'install $_'\n\n\n" ; 
           $msg .= "\n if you seem to be stuck in circular reference kind of loop try even :\n" ; 
           $msg .= "\n sudo perl -MCPAN -e 'CPAN::Shell->force(qw( install $_));'\n" ; 
           $msg .= "\n You may end-up now with Ctrl + C \n\n\n" ; 

           return ( 1, "$msg")  if $@;
         } else {
             say "[INFO ] == ok == check for prerequisite perl module : $_";
         }
     }

     return ( 0 , "all required modules found" ) ;   
  }
  #eof sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接