5

摘要问题

我是否只是对每个 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 次似乎是草率和浪费。显然,分发只是一个文件,但它比它需要的要大得多。虽然整个应用程序只有一个 perlapp 可执行文件,但 perl 运行时可以方便地捆绑到可执行文件中。但随着时间的推移,功能(即可执行文件)被添加,浪费和草率增加。

为了做到这一点,我很确定我必须使用 --dependent perlapp 命令行选项。当我测试该选项的使用时,我发现捆绑的可执行文件的大小大大减少。删除临时文件夹并执行依赖的可执行文件后,它看起来像捆绑了与以前相同的模块。

这是我的“如何”问题。

Q1(迄今为止最重要的)

如果我将 --dependent 选项添加到我的 perlapp 命令,那么我是否应该期望perlapp 捆绑它以前捆绑的所有模块?我认为这里的答案是“是”,但我希望像 Graham Stuart 这样的人做出回应。

第二季度

当执行这些依赖的可执行文件时,我所要做的就是确保静态链接的 perl 在 PATH 中,这是真的吗?

Q3(Q2 重新措辞以进行额外说明)

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

附言

我尝试在 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,我无法真正了解真相。我不得不依靠别人来告诉我“是的,你即将做正确的事情,当你做 x 时,你不会在 6 个月后被咬”。

4

1 回答 1

1

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

目前它只支持Strawberry Perl,但添加对 AS Perl 的支持应该不会太难。

于 2018-02-07T15:51:52.617 回答