3

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

4

3 回答 3

3

pp提供的脚本PAR::Packer能够创建单文件可执行文件。其页面中的示例:

pp -o foo foo.pl bar.pl   # Pack 'foo.pl' and 'bar.pl' into 'foo'
于 2012-08-19T07:34:21.087 回答
3

一些模块包含在 Perl 中,因此即使它们是单独的模块,它们也可以在其他 Perl 安装中工作,而无需安装这些模块。这些包括File::Copy, File::Find, Time::Piece

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

您需要的模块完全有可能已经包含在标准 Perl 发行版中,因此无需担心。有时,您可以将正在使用的非标准模块替换为几乎不需要重写的标准模块。

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

如果一个模块不是标准模块,它是一个纯 Perl 模块,有两种方法可以重新分发它:

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

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


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

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

当然,做 adie有点傻,因为use会那样做。但是,有可能通过CPAN 模块程序员的界面加载模块而不是死掉。我从来没有这样做过,我不知道有谁这样做过。但是,这是可能的。

所以,最好的办法是检查你的程序是否使用标准的 Perl 模块,如果没有,看看你是否可以修改程序来使用它们。例如,如果您的程序使用Archive::Zip,您可以修改它以使用IO::Uncompress::UnzipandIO::Compress::Zip代替。

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

于 2012-08-19T04:02:10.017 回答
1

答案有点复杂。

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

但是您实际上可以将 Perl 解释器嵌入到任何 C 应用程序中,包括 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 将自行找出所有内容并可能进行必要的编译。我不认为这完全是一个初学者的话题,但它会给你最大的灵活性和可维护性(轻松升级!)。这应该使得包含一些安装测试变得相当容易。

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

于 2012-08-19T03:58:29.613 回答