如何分发具有多个perlapp可执行文件但仅分发一个perl的应用程序

如何分发具有多个perlapp可执行文件但仅分发一个perl的应用程序,perl,activestate,perlapp,Perl,Activestate,Perlapp,摘要问题 我是否只是对每个perl脚本使用perlapp--dependent,然后确保在构建期间将perl static复制到应用程序的bin目录(称之为perl) 背景 我目前正在分发一个包含许多perlapp独立可执行文件的应用程序,这意味着它们每个都包含一个perl运行时的捆绑副本 我希望在我的应用程序中只分发一个perl运行时副本,并让每个可执行文件引用我将分发的一个perl运行时 例如,假设我有10个perl脚本组成我的应用程序。当我为两个演示脚本中的每一个执行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次似乎是草率和浪费的。显然,分发版只是一个文件,但它比需要的要大得多。虽然整个应用程序只有一个perlapp可执行文件,但perl运行时可以方便地捆绑到可执行文件中。但随着时间的推移,功能(即可执行文件)被添加,浪费和草率增加

要正确地执行此操作,我非常确定必须使用--dependent perlapp命令行选项。当我测试该选项的使用时,我看到捆绑的可执行文件的大小大大减小。删除临时文件夹并执行依赖的可执行文件后,看起来它已经像以前一样绑定了相同的模块

以下是我的“如何”问题

Q1(到目前为止最重要)

如果我将--dependent选项添加到perlapp命令中,那么我应该期望perlapp捆绑它以前捆绑的所有模块吗?我想这里的答案是“是的”,但我希望像格雷厄姆·斯图尔特这样的人做出回应

问题2

当这些依赖的可执行文件被执行时,我所要做的就是确保静态链接的perl位于路径中,这是真的吗

第三季度(第二季度重新编写,以便进一步澄清)

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个可执行文件,那么分发量将大约为3MB,节省大约19MiB


当我取消设置PATH时,可执行文件会引发一个错误,因为找不到perl可执行文件。这就是为什么我认为发行版只需要perl运行时与可执行文件一起位于bin目录中。这似乎是一个合理的解决方案,但由于我没有写perlapp,我无法真正了解真相。我必须依靠其他人告诉我“是的,你将要做正确的事情,6个月后当你做x时你不会被咬。”

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


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

@ikegami不,当我的应用被复制到用户桌面上时,我不会安装Perl。我故意使应用程序没有安装程序。构建过程将在构建时将本地构建机器的perl放入发行版中。我认为正确的假设是:(1)perlapp无需安装perl,(2)perlapp只需捆绑模块和perl rutime,(3)使用perlapp--dependent复制perl static plus与perlapp--freenstanding是一样的。@ikegami这取决于您对“安装”一词的定义。您选择的这些词让我相信,您认为我将像下载perl源代码并执行“makeinstall”一样安装perl。我不打算做这类事情。@ikegami你最后的评论毫无意义,因为我的问题是如何分发,比如说,10个perlapp包装的可执行文件,但只分发一个perl来节省空间。我不想为每个可执行文件“安装”一个perl。这是一种可怕的浪费。此外,perlapp包装的可执行文件并不真正安装任何东西。是的,它会将一些文件写入/tmp(或/var/tmp),但不会安装任何东西。这就是为什么它通常被称为独立的。但是根据文档,它不是独立的,与
--dependent
。它需要一个外部的
perl
。您计划使用哪个
perl
?我以为您将尝试“安装”一个重型pkg和9个轻型pkg,并让9个轻型pkg在重型pkg中使用
perl
。那是个坏主意。也许我误解了?@ikegami我目前有10个重包,希望10个包中的每一个都能在perl上使用10个轻包。到目前为止,我唯一的想法是使用--dependent并分发perl,如果perlapp被赋予--relependent指令,它将绑定到perl。但我仍然担心--dependent会导致perlapp捆绑更少(可能是通过一些bug)我的代码使用的模块。我非常感谢尝试的答案。在谈话的深处,有一个半公开的要求,即没有安装