我该如何发布(分发)一个Perl应用程序?

10
我用Perl编写了一个程序,现在我想将它发送给我的伙伴。我不希望他在启动它时遇到任何问题。
我该如何制作一些包,让他只需点击即可准备好所有启动所需的东西?
附注:我可以让他先下载并安装ActivePerl。
另外,如果将来我需要进行生产交付的规模扩展呢?也就是说,接收方不再是伙伴而是客户先生?
附注:我不需要将.pl源文件隐藏起来。我需要自动下载和安装所有必需的CPAN模块。

嗯,“点击”?我认为你应该在你的问题中添加一些标签。 - tchrist
是的,点击,就像鼠标点击一样。你能更具体地说出你指的一些标签吗?好吧,我的朋友对命令行很熟悉,所以他也可以很好地运行安装命令。 - frepkin
类似于WINDOWS这样的东西,很多人都忽略了。:) 也许还有MOUSE或者GUI之类的东西。外星世界,一切都是那么陌生。 - tchrist
我打上了 windows 标签是因为看到标题时我的第一个想法是“当然是通过 CPAN”。 - Dallaylaen
@Dallaylaen,我想把我的程序发给我的朋友,而不是在某个网络上发布它。我在我的问题中提到了这一点。此外,我的问题并不仅限于Windows,我也接受Linux的答案。只要它能提供自动一键安装的解决方案或一条命令即可。 - frepkin
6个回答

14
我曾经非常成功地使用了 pp。它可以将 Perl 解释器和所有使用的模块一起打包到可执行文件中。
另外还有B::C,它提供了一个perlcc实用程序,但我使用它时没有那么成功。

4
PAR::Packer是一种非常出色、可能也是最简单的打包方式。使用加密过滤器,你甚至可以对源代码进行编码。虽然最终如果有人想要解码并重用你的代码仍然是有可能的,但我不认为这是你所关心的问题。唯一可能会引起一些问题的是,在构建PAR exe时,某些库的DLL可能不会被包含在内。但你可以手动将它们包含进来。 - Htbaa
2
pp 在没有安装 Perl 的计算机上通常可以正常工作。但是当与已经存在的 DLL 冲突时(例如在已经安装了 5.10 Perl 的计算机上运行从 5.8 Perl 编译的程序等),我曾经遇到过各种问题。我也看到过许多与上述加密过滤器有关的问题——很多程序都有不同版本的 libeay.dll,这经常导致编译的程序失败。 - bvr
@frepkin,尝试使用-x标志运行它,这告诉pp在打包时执行程序。当它运行时,请确保使用需要额外模块的任何功能。当程序调用这些模块时,pp会注意到它们,然后一定会将它们包含在包中。这可能是你的问题所在。如果不是,那么你就已经达到了我的知识极限。 - Joel Berger
@Joel,非常感谢您回复我的报告,尽管我地址写错了。pp -x myprogram.pl 给出了奇怪的结果:程序似乎在 pp 下正常运行,产生了所有通常的输出,但最终的 .exe 文件没有做任何事情或输出,就像没有使用 -x 一样。不过我会进一步研究这个问题。 - frepkin
2
@Joel,我解决了这个问题。只是因为我太聪明了,对我的程序进行了“模块化”,起始行是run() unless caller; 在阅读了 brian d foy 在perlmonks上的文章《脚本如何变成模块》以及评论之后,我了解到PAR使caller定义了,所以现在这一行看起来像是 run() unless caller and caller ne 'PAR'; 然后它就能工作了!感谢您在线上! - frepkin
显示剩余4条评论

7

谢谢@daotoad。当我运行ppm install Par::Packerppm install PAR::Packer时,它会显示“找不到任何提供Par::Packer的软件包”。我将研究另外两个。 - frepkin
1
如果您正在使用ActiveState,我认为在其他存储库中必须提供ppm。 - Htbaa
@frepkin,请查看Kobesearch上的PAR::Packer,它列出了提供不同版本ActivePerl的PPM存储库的PPMs。http://cpan.uwinnipeg.ca/search?query=PAR%3A%3APacker&mode=dist - daotoad
@Htbaa,@daotoad,我已经通过ppm repo add命令将这些存储库添加到了ppm中,但出于某种原因它并没有起作用。但是对我来说,cpan PAR::Packer完全没问题。 - frepkin

5
尽管我最喜欢Joel的建议,但我想为您指出另一个解决方案。看起来您的目标是Windows系统,因此您也可以使用Strawberry Perl的便携式版本。安装所需的模块,将您的脚本/应用程序添加到其中,设置一个简单批处理脚本以便在便携式环境下启动它即可完成设置。
与pp(PAR::Packer)解决方案相比,最大的缺点是您的应用程序大小会相当大,因为pp只包含必要的内容。

1
pp生成的可执行文件很难精简,因为“必要的内容”包括Perl解释器和相当多的标准库,这些都在你的脚本之前。即使是一个“小型”的pp生成的可执行文件也有几MB大小。 - Michael Carman
1
我们通过pp打包后分发的一个应用程序是一个Wx应用程序,大小约为15MB。当包括Strawberry Perl的便携式版本时,您还需要包括C/C++编译器和工具链,这个压缩包几乎有57MB大。因此,这是相当大的差异。 - Htbaa

4

你可能正在寻找IndigoStar的perl2exe

Perl2Exe是一个命令行程序,用于将Perl脚本转换为可执行文件。这使您可以创建独立的Perl程序,而无需Perl解释器。您可以发送可执行文件,而无需发送Perl源代码。 Perl2Exe可以为Windows和Unix目标主机生成可执行文件。

当然,最简单的方法是让您的客户端能够运行perl。


谢谢。我会研究perl2exe。不需要发送源代码可能很好,但目前我没有这个需求。 - frepkin
我的朋友肯定可以按照我的要求下载并安装Perl本身,我已经提到了这一点。但是我不想必须向他解释他必须手动安装哪些CPAN模块。 - frepkin
perl2exe 也可以处理模块。 - Tim
2
Nordendfur,只是因为我很好奇(并不是想挑衅),perl2exe相比于pp,在花费上有什么优势呢? - Joel Berger
@Joeld:没有什么重大的问题。据我所知,pp 无法从模块中制作 DLL 文件以在应用程序之间共享。我也赞同你的答案。 - Tim

2
您可能希望尝试Cava Packager。它可以在Windows、Linux和Mac OS X上从Perl代码生成可执行文件。它采用了与PerlApp、pp和perl2exe不同的方法。您应该尝试它们并决定哪个最适合您。
注:正如我的名字所示,我与Cava Packager有关联。

0

Par::Packer可以为您完成这项工作,而且完全免费,无需任何麻烦。只要安装了正确的依赖项,您就可以在Windows计算机上打开命令提示符,CD到包含您的Perl源代码(例如'samplefile.pl')的目录中,并键入:pp-o sampleprogram.exe samplefile.pl。大约一分钟后,'samplefile.exe'就被编译了,您可以将其发送给朋友运行

Perl2Exe是一种专有解决方案,虽然很好,但并不免费

祝您好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接