如何使用许多perlapp可执行文件分发应用程序,但只分发一个perl

时间:2018-02-05 23:23:49

标签: perl activestate perlapp

摘要问题

我是否只为每个perl脚本使用perlapp --dependent,然后确保在构建期间将perl-static复制到应用程序的bin目录(称为perl)?

背景

我目前正在发布一个包含许多perlapp独立可执行文件的应用程序,这意味着它们每个都包含perl运行时的捆绑副本。

我想在我的应用程序中只分发perl运行时的一个副本,并让每个可执行文件引用我将分发的一个perl运行时。

例如,假设我有10个构成我的应用程序的perl脚本。当我为两个演示脚本中的每一个执行perlapp时,我看到类似这样的内容:

+ ls -l
-rw-r--r--  1 -----  staff   55 Feb  5 21:03 t1.pl
-rw-r--r--  1 -----  staff   62 Feb  5 21:03 t2.pl
+ perlapp --force t1.pl
PerlApp 9.5.1 build 300018
Copyright (C) 1998-2016 ActiveState Software Inc. All rights reserved.
Commercial license for ..................................

Created 't1'
+ perlapp --force t2.pl
PerlApp 9.5.1 build 300018
Copyright (C) 1998-2016 ActiveState Software Inc. All rights reserved.
Commercial license for ..................................

Created 't2'
+ ls -l
-rwxr-xr-x  1 -----  staff  2266356 Feb  5 21:07 t1
-rw-r--r--  1 -----  staff       55 Feb  5 21:03 t1.pl
-rwxr-xr-x  1 -----  staff  2026992 Feb  5 21:07 t2
-rw-r--r--  1 -----  staff       62 Feb  5 21:03 t2.pl

ls -l `which perl`
-rwxr-xr-x  1 root  wheel  1978336 Mar 19  2015 /usr/local/ActivePerl-5.20/bin/perl-static

在上面的输出中,你可以看到两个(我有10个到目前为止)可执行文件中的每一个都是大约2Mib,一个对应于每个perl脚本。在每个捆绑的可执行文件中,都有一个perl运行时。如果我要分发所有这10个,那么分配将超过22MiB。

当应用程序只需要一个perl运行时,强制客户有效下载perl运行时10次似乎是草率和浪费。显然,分发只是一个文件,但它比它需要的大得多。虽然整个app只是一个perlapp可执行文件,但perl运行时可以方便地捆绑到可执行文件中。但随着时间的推移,特征(即可执行文件)被添加,浪费和邋。的增加。

为了做得对,我非常确定我必须使用--dependent perlapp命令行选项。当我测试该选项的使用时,我看到捆绑的可执行文件的大小大大减少。删除临时文件夹并执行从属可执行文件后,它看起来像是捆绑了与以前相同的模块。

这是我的"怎么"的问题。

Q1(到目前为止最重要的)

如果我在我的perlapp命令中添加--dependent选项,那么我是否应该> perlapp捆绑以前捆绑的所有模块?我认为这里的答案是"是的"但是我想像Graham Stuart这样的人回应。

Q2

我必须做的就是确保执行那些相关的可执行文件时,静态链接的perl是否在PATH中?

第3季(Q2重新进行了澄清)

perlapp是否捆绑了perl的静态链接版本?我认为确实如此,但我想再确保做一些同等的事情。

PS

我尝试在ActiveState的pdk论坛上发布主题,但我不认为该界面正在接受我的帖子,因为它显示我的帖子未发布,不知道如何发布。

如果我使用--dependent选项,那么我会看到:

+ perlapp --force --dependent t1.pl
PerlApp 9.5.1 build 300018
Copyright (C) 1998-2016 ActiveState Software Inc. All rights reserved.
Commercial license for ..................................

Created 't1'
+ perlapp --force --dependent t2.pl
PerlApp 9.5.1 build 300018
Copyright (C) 1998-2016 ActiveState Software Inc. All rights reserved.
Commercial license for ..................................

Created 't2'
+ ls -l
-rwxr-xr-x  1 -----  staff  108560 Feb  5 21:07 t1
-rw-r--r--  1 -----  staff      55 Feb  5 21:03 t1.pl
-rwxr-xr-x  1 -----  staff  108608 Feb  5 21:07 t2
-rw-r--r--  1 -----  staff      62 Feb  5 21:03 t2.pl

在上面的输出中,您可以看到文件非常小,以至于它们不可能捆绑perl运行时。如果我分发perl-static和上述10个可执行文件,那么分发将大约为3MiB,节省约19MiB。

当我取消设置PATH时,可执行文件会引发错误,因为找不到perl可执行文件。这就是为什么我认为分发只需要perl运行时在可执行文件的bin目录中。似乎是一个合理的解决方案,但由于我没有写perlapp,我真的不知道真相。我必须依靠别人来告诉我"是的,你将要做正确的事情,6个月后当你做x&#34时,你不会被咬伤。

1 个答案:

答案 0 :(得分:1)

不完全是您正在寻找的解决方案,但Win32::Packer支持该功能。您告诉它构成应用程序的脚本集,它将所有脚本打包为一个包含所有依赖项的MSI安装程序和所有脚本的.exe包装器。

目前它只支持Strawberry Perl,但也不难添加对AS Perl的支持。