摘要问题
我是否只为每个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时,你不会被咬伤。
答案 0 :(得分:1)
不完全是您正在寻找的解决方案,但Win32::Packer支持该功能。您告诉它构成应用程序的脚本集,它将所有脚本打包为一个包含所有依赖项的MSI安装程序和所有脚本的.exe
包装器。
目前它只支持Strawberry Perl,但也不难添加对AS Perl的支持。