我正在创建一个perl中的代理,它可以执行多个操作。它使用了.pm格式的几个模块以及很少的库。现在我想将其转换为一个可执行文件,以便我可以通过复制该单个文件安装在n个服务器中。这是我在perl中可以实现的吗?我只是perl的初学者,也许我的问题可能听起来很愚蠢,但它会教会我一些东西。
答案 0 :(得分:3)
Perl中包含一些模块,因此即使它们是单独的模块,它们也可以在其他Perl安装上运行而无需安装这些模块。其中包括File::Copy
,File::Find
,Time::Piece
。
您可以在Perldoc主页上看到所有标准模块的列表。请务必将下拉版本字段(位于左侧)设置为您正在使用的版本。它一直追溯到Solaris上的Perl 5.8.8。
完全有可能您需要的模块已包含在标准Perl发行版中,因此无需担心。有时候,你可以用一个非标准模块替换那个标准模块而非重写的模块。
某些模块包含已编译的C代码,无法重新分发。它们必须在他们运行和安装的机器上编译。但是,大多数模块都是纯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::Unzip
和IO::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会自行确定所有内容,并可能进行必要的编译。我不认为这确实是一个初学者话题,但它会给你最大的灵活性和可维护性(易于升级!)。这应该可以很容易地包含一些安装测试。
这只适合初学者,我相信互联网或其他有更多知识的人会详细说明。