【问题标题】:How to check availability of Perl, its version and presence of a required module?如何检查 Perl 的可用性、版本和所需模块的存在?
【发布时间】:2011-02-06 00:38:07
【问题描述】:

我写了一个 Perl 脚本,我只是想把它交给每个人, 为此,我计划编写一个 bash 脚本,用于测试用户的环境并确定该环境是否能够运行 Perl 脚本。

我想测试以下内容:

  1. 该系统中是否安装了 Perl
  2. Perl 应该有版本 5 或更高版本
  3. 模块 JSON::Any 是否可用

任何建议将不胜感激:-)

【问题讨论】:

    标签: bash perl perl-module


    【解决方案1】:

    关于检查 Perl 可用性,最简单的方法是检查命令perl -v 的返回码(退出码),如果不是0,则说明你没有 Perl。

    现在关于 Perl 要求,您应该在您的 Perl 脚本中处理它们:

    #!/usr/bin/env perl
    use 5.006_001;
    use ModuleName 2.0;
    

    上面的 Perl 代码只能在 perl 5.6.1 或更高版本以及 modele "ModuleName" 2.0 或更高版本上运行。 无需手动从 bash 中检查 Perl 版本,直接从 Perl 脚本中检查会更好、更容易。

    参考资料:

    【讨论】:

    • 我不想打印更多细节,我只想知道版本号,当我发出 perl -v 命令时,任何建议
    • 你用use 5.006_001检查perl本身的版本号。 perl -v 只是检查是否可以执行 perl 二进制文件(=> 检查是否安装了 perl),您可以忽略它打印的所有内容,只是执行的返回值很重要。
    • 该问题确实询问“系统上是否安装了 perl”。您的答案排除了“找不到 perl”响应的自动化(perl 丢失,或者更有可能不在 PATH 上)。诚然,我使用的每个系统都安装了 Perl - 但提问者担心“那里根本没有 perl”。
    • "...您应该从 Perl 脚本中处理它们..." - 如果没有 Perl 脚本怎么办。就我而言,我有一个检查先决条件的 Bash 脚本,它需要检查是否存在 Perl 模块。没有可用的 Perl 脚本。
    【解决方案2】:

    不,不要编写 shell 脚本。 Perl 已经有一个非常好的方法来做到这一点。执行此操作的正确方法是使用普通工具链构建 CPAN-ready 发行版。其中一些在perlnewmodperlmodstyleperlmodinstall 中有解释。

    对于一个最小的工作示例,创建一个目录布局:

    .
    ├── Build.PL
    ├── README
    └── script
        └── abuscript.pl
    

    Build.PL 文件中,输入:

    use 5.000;
    use Module::Build qw();
    Module::Build->new(
        module_name        => 'abuscript',
        dist_version       => '1.000',
        dist_author        => 'abubacker <abubacker@example.com>',
        dist_abstract      => 'describe what the script does in one sentence',
        configure_requires => {
            'perl' => '5.000',
        },
        requires           => {
            'JSON::Any' => 0,
        },
    )->create_build_script;
    

    根据您的目的更改详细信息。

    README文件中,放一些安装说明,例如:

    To install this module, run the following commands:
    
    perl Build.PL
    ./Build install
    

    完成所有这些后,您可以运行:

    perl Build.PL
    ./Build manifest
    ./Build dist
    

    这将产生一个您将分发的.tar.gz 存档。告诉您的用户像安装任何其他 CPAN 模块一样安装它,或者如果他们不知道这意味着什么,他们应该阅读自述文件。

    如果您有时间,我建议您将脚本转换为模块。程序pl2pm(Perl 自带)和CPAN 模块Module-Starter-PBP 为您提供帮助。

    如果许可证允许,您可以将您的代码上传到 CPAN,以使您的用户更加方便。首先在以下任何地方寻求帮助:邮件列表module-authors@perl.org、网络论坛PerlMonks、MagNET 上的IRC 频道#toolchain (irc://irc.perl.org/toolchain)

    【讨论】:

    • 根据 CPAN 标准,如果我有自己的 .pm 文件,我应该在哪里添加它,包括 Build.PL 和文件结构?另外,如果我有多个 Perl 脚本,比如“script1.pl”和“script2.pl”,我该如何在 Build.PL 中添加它? module_name => 'script1.pl, script2.pl',?我找不到这方面的例子。
    • 示例:如果您有一个主模块,其包声明为Fus::Roh::Da,请将其重命名为Da.pm 并将其移动到lib/Fus/Roh/Da.pm。在Build.PL 中,指定module_name =&gt; 'Fus::Roh::Da'。只需将您的两个脚本放入子目录script,其余的将在安装时自动运行。 – 您可以通过运行perl Build.PL --install_base /tmp ; ./Build install 来测试您的构建文件,并在/tmp 目录中检查结果。运行./Build distclean 并手动删除已安装的文件以重新开始。
    • 好的,我照你说的做了。我的脚本现在在哪里?我希望将它复制到 /usr/bin 的某个地方,将名称从 script.pl 更改为 script 并添加可执行权限。我得到的是一个空目录/usr/lib/perl5/site_perl/auto/TerminalHero。顺便说一句,Build 可以温和地询问 root 密码,而不是大喊大叫 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ERROR: Can't create '/usr/lib/perl5/site_perl/auto/TerminalHero' Do not have write permissions on '/usr/lib/perl5/site_perl/auto/TerminalHero' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    • 最后一步必须是sudo ./Build install 或功能相似。 Build 可以要求输入 root 密码,但这将禁止无人值守安装,这一步只是其中的一小部分;在这种情况下还添加了大喊大叫,因为否则它会在屏幕上滚动而不会被注意到。 - 您可以配置cpan (make_install_make_command and mbuild_install_build_command) 和cpanm (-S switch) 以使用sudo,然后通过这些工具之一安装您的发行版。
    • 是的,我知道我可以用 sudo 做到这一点。但即使在那之后(或直接从 root shell 运行构建之后),我的脚本也没有安装在系统的任何地方。我唯一得到的是这个空目录。
    【解决方案3】:
    if perl -MJSON::Any -e 'print "$JSON::Any::VERSION\n"' >/dev/null 2>&1
    then : OK
    else echo "Cannot find a perl with JSON::Any installed" 1>&2
         exit 1
    fi
    

    我经常使用 '${PERL:-perl}' 和类似的结构来识别命令(awk vs nawkgawktroff vs groff;等等)。

    如果您想测试 JSON::Any 的版本,请改为捕获命令的输出。 如果您想测试 Perl 的版本,请添加 'use 5.008009;' 或您认为合理的任何数字。 (就在不久前,他们终于从一个工作中的 NFS 挂载文件系统中删除了 Perl 4 - 但这不是机器上唯一的 Perl - 至少,在过去十年或更长时间里没有!)

    【讨论】:

    • 我更喜欢 perl -MJSON::Any -e1 2&gt;/dev/null - 打印版本并将其发送到比特桶有什么意义
    • @justintime:正如我所说,如果您想检查 JSON::Any 的版本,请捕获输出 - 它让我不必在单独的练习中解释如何获取版本。
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 2017-02-03
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2013-12-09
    • 2011-03-14
    • 1970-01-01
    相关资源
    最近更新 更多