轻松构建独立Perl应用程序的简便方法

Perl工具链拥有如此庞大的安装基础,以至于上传您的应用程序到PAUSE并让用户通过CPAN安装它是非常诱人的。《许多作者》都采取了这种方法,并且在大多数情况下,为了重复利用CPAN在提供通用安装、依赖关系管理和更新机制方面的功能,这是有意义的。有时,您可能希望在一个单独的可执行文件中分发一个无依赖关系的Perl应用程序,而对于这些情况,您将需要查看《App::FatPacker》。

需求

您需要一个基于Unix的系统(Linux,OSX,BSD)并安装《App::FatPacker》。它适用于从5.8.8以上的每个Perl版本,因此只需启动终端,输入以下内容即可

cpan App::FatPacker

编写您的应用程序

您可以将任何典型的Perl脚本转换为独立应用程序,只要它没有XS依赖关系(有关如何创建具有XS依赖关系应用程序的更多信息,请参阅下文“App::Fatpacker的替代品”)。以下是一个建议的示例

#!/usr/bin/env perl

此shebang行将调用“env”程序,并将“perl”作为参数传递。这解决了Perl二进制文件在不同平台上的不同位置安装的问题,因为它将使用用户路径中的Perl二进制文件。这已在《perlrun》中记录。它也与Perlbrew兼容。

生成单个文件应用程序

这非常简单:一旦您的Perl脚本准备就绪,打开终端并输入以下内容,用您自己的路径替换它们

fatpack pack /path/to/script > /path/to/app

这将打包您的脚本使用的所有依赖项到一个单独的可执行应用程序中。

运行应用程序

现在,您的应用程序已在一个文件中,分发和运行它就像小菜一碟。只需将文件复制到您的$PATH中的任何目录。为了能够运行您的新应用程序,您需要将其权限设置为可执行。您可以使用chmod来完成此操作

chmod 755 /path/to/app

现在,只需在终端中输入应用程序文件名即可运行应用程序。

一个简单的示例

假设我们有一个以下脚本,BillCalc.pl,它使用虚构的“Math::Bill”库计算每人在晚餐中应该支付多少钱。

#!/usr/bin/env perl
use strict;
use warnings;
use Math::Bill;
use feature 'say';
use Carp 'croak';

croak "Error: missing arguments. Requires a bill total and number of people at dinner. e.g:\n   BillCalc 100.40 3" unless @ARGV == 2;

my $bill = Math::Bill->new($ARGV[0], $ARGV[1]);

say 'Each person should pay: ' . $bill->apportion . ' each';

我们可以使用App::Fatpacker将BillCalc.pl打包成一个单个文件的应用程序

fatpack pack BillCalc.pl > BillCalc
BillCalc.pl syntax OK

App::Fatpacker打印出确认消息(“BillCalc.pl语法正确”),我们应现在当前目录中有一个新文件,名为“BillCalc”。此文件将包含“Math::Bill”的所有内容以及BillCalc.pl中的任何其他依赖项。

让我们将其移动到我的$PATH中的一个目录中,/home/sillymoose/local/bin

mv BillCalc /home/sillymoose/local/bin

并更改文件权限为可执行

chmod 755 /home/sillymoose/local/bin/BillCalc

现在我们可以在命令行中运行BillCalc应用程序

BillCalc 120 3
Each person should pay: 40 each

要查看使用App::FatPacker创建的Perl应用程序的实际示例,请参阅我们关于every(cron调度应用程序)的文章。

App::FatPacker的替代品

PP》是另一种可以创建独立Perl应用程序的Perl工具。它还支持XS模块依赖项(与App::FatPacker不同)。

当然,您也可以通过CPAN分发应用程序,在这里您可以根据需要在应用程序的inc目录中包含依赖模块,或者在makefile中将模块作为依赖项包含,并让CPAN为您安装它们——这也会更节省磁盘空间。CPAN上的Perl应用程序将应用程序放置在应用程序的bin目录中,并在makefile中使用“EXE_FILES”指令将应用程序安装到Perl的bin目录中。如果您对此方法感兴趣,可以查看Module::Starter源代码作为借鉴的好例子。


本文最初发布在PerlTricks.com上。

标签

David Farrell

David是一位专业程序员,他经常在Twitter博客上撰写有关代码和编程艺术的帖子。

浏览他们的文章

反馈

这篇文章有什么问题吗?请通过在GitHub上打开问题或pull request来帮助我们。