Perl为脚本生成一个可执行文件,该脚本使用任意数量的模块和库

时间:2012-08-19 03:25:42

标签: perl

我正在创建一个perl中的代理,它可以执行多个操作。它使用了.pm格式的几个模块以及很少的库。现在我想将其转换为一个可执行文件,以便我可以通过复制该单个文件安装在n个服务器中。这是我在perl中可以实现的吗?我只是perl的初学者,也许我的问题可能听起来很愚蠢,但它会教会我一些东西。

3 个答案:

答案 0 :(得分:3)

Perl中包含一些模块,因此即使它们是单独的模块,它们也可以在其他Perl安装上运行而无需安装这些模块。其中包括File::CopyFile::FindTime::Piece

您可以在Perldoc主页上看到所有标准模块的列表。请务必将下拉版本字段(位于左侧)设置为您正在使用的版本。它一直追溯到Solaris上的Perl 5.8.8。

完全有可能您需要的模块已包含在标准Perl发行版中,因此无需担心。有时候,你可以用一个非标准模块替换那个标准模块而非重写的模块。

某些模块包含已编译的C代码,无法重新分发。它们必须在他们运行和安装的机器上编译。但是,大多数模块都是纯Perl模块,可以通过程序重新分发。

如果模块不是标准模块,并且它是纯粹的Perl模块,则有两种方法可以重新分发:

  • Perl有一个@INC列表,说明搜索模块时要搜索的目录。有一个Perl use lib编译指示允许您添加目录。您可以将模块作为程序的子目录包含在内,然后压缩整个结构。用户将解压缩整个目录树,其中包括您的程序和所需的模块。顺便说一句,默认@INC通常包括当前目录。
  • 另一种方法是将模块附加到您的程序,然后删除该模块的use语句(因为它现在是文件的一部分)。这有点棘手,但它意味着一个程序文件。

请记住,模块可能需要另一个模块,因此请仔细检查。


您可以做的另一件事是检查模块,如果不存在,请通过CPAN下载。测试很简单:

BEGIN {
    eval {
        require My::Module; Module->import( LIST );
    };
    if ($@) {
        die qq(Module doesn't exist);
    }
}

当然,做一个die有点傻,因为use会这样做。但是,可能有可能通过CPAN module程序员的界面来加载模块而不是死亡。我从来没有这样做过,而且我不认识那些拥有的人。但是,这是有可能的。

因此,最好的办法是检查您的程序是否使用标准的Perl模块,如果没有,请查看是否可以修改程序以使用它们。例如,如果您的程序使用Archive::Zip,则可以将其修改为使用IO::Uncompress::UnzipIO::Compress::Zip

否则,您的选择是尝试包含这些模块以进行安装(并注意递归和非纯Perl模块)或尝试检测未安装模块,并以编程方式安装它。

答案 1 :(得分:3)

pp提供的

PAR::Packer脚本能够创建单文件可执行文件。来自其页面的一个例子:

pp -o foo foo.pl bar.pl   # Pack 'foo.pl' and 'bar.pl' into 'foo'

答案 2 :(得分:1)

答案有点复杂。

Perl的本质使得在大多数用例中编译perl脚本几乎是不可能的,因此可以分发单个可执行文件(在Windows意义上使用 executable )。有办法做类似的事情,但遗憾的是我不知道。

但您实际上可以在任何C应用程序中嵌入Perl解释器,包括Perl源代码(您的脚本+模块)。当您静态链接所有C库时,这也应该工作。然后,您可以使用Perl API来调用脚本。

如果您所定位的所有服务器都保证运行完全相同的操作系统,使用完全相同的库,并且最好是某种类型的* nix,则可以将所有必需的文件打包到存档中并编写安装脚本。可以编写包含要解压缩的归档的自解压shell脚本。与perl相同,使用特殊的__DATA__命令和DATA文件句柄:

#!/usr/bin/perl
print for <DATA>;
__DATA__
1
2
3

打印

1
2
3

非常适合将数据传输到tar

您应该将所有依赖模块和所有已编译的库包含到文件中,并找出元数据系统以将所有文件安装到正确的位置。

作为一般规则,软件应该在目标系统本身上编译,而不仅仅是复制二进制文件。很容易忽略从视图中隐藏的架构差异,配置文件或特殊注册条目。

如果您必须针对不同的系统,最好编写一个脚本,将大部分安装委派给cpan或您喜欢的任何perl软件包管理器。这比硬编码文件路径更灵活。

 #!/bin/bash
 cpan install Foo::Bar
 cpan install Acme
 cpan install ...
 # etc.

我会坚持下去。

最优雅的解决方案是创建您自己的包或分发,就像您从CPAN下载的那样。正如您将包含引用所有依赖项的元数据文件一样,cpan会自行确定所有内容,并可能进行必要的编译。我不认为这确实是一个初学者话题,但它会给你最大的灵活性和可维护性(易于升级!)。这应该可以很容易地包含一些安装测试。

这只适合初学者,我相信互联网或其他有更多知识的人会详细说明。