如何扩展二进制Perl分发

4
我运行一个名为"Senora"的开源项目,它用Perl编写并处理Oracle数据库。直到最近,它可以使用随Oracle提供的Perl分发版轻松运行。
但最近我尝试添加更多功能,需要使用LibXML。个人在工作中运行Strawberry Perl,添加LibXML没有问题。然而,我的用户没有他们自己的perl,必须使用机器上找到的任何东西(oracle perl总是存在)。
我已经向我的Senora树添加了一个lib目录,并将一些纯Perl模块放在其中,这是oracle perl不提供的。这有效。
但是对于编译代码该怎么办呢?我很想从我的Strawberry树中复制dlls,但这感觉太像黑客。毕竟,这段代码不是针对oracle perl进行编译的。
我也很想给我的用户完整的Strawberry树。这很丑陋。
那么,除此之外,我还有哪些选项可以向我的Senora分发中添加“仅缺失的”内容,以便与oracle perl一起运行呢?

如果有帮助的话,Strawberry Portable 不需要安装或特殊系统权限,它可以安装 DBD::Oracle,并且可移植性是文件的普通压缩/解压缩。 - mpapec
我只是不想告诉我的用户,为了运行Senora,他们还需要安装另一个Perl。 - Martin Drautzburg
你可以将所有东西捆绑在一起,然后给它们一个zip文件。 :) 如果Java程序最终会抱怨JRE,那么Perl程序为什么不能做同样的事情呢? - mpapec
1
这就是我为Windows系统提供我的宠物项目的方式:使用InnoSetup创建一个安装程序,其中包含一个削减和扩展的便携式Strawberry Perl和我的应用程序。用户将获得一个熟悉的安装程序,甚至不会太大(约10MB)。 - Slaven Rezic
2个回答

2

简而言之: 通过CPAN分发Perl模块非常容易和有趣,但只有当每个人都拥有完整的perl安装时才能实现。对于其他情况,这很糟糕。

  • 通常通过CPAN分发Perl程序,它提供自动依赖项安装。然而,一些模块需要工作的C编译器链进行安装。许多用户运行没有此功能的缩减版perl。唯一的解决方案是打包预编译文件,但必须针对每个操作系统和每个perl配置单独完成。这就是一些操作系统供应商(如Debian或RedHat)和一些Perl供应商(如ActiveState)所做的。

    这些供应商都提供说明来构建您自己的包,这些包可以使用各自的软件包管理器进行安装。

  • 如果目标系统具有C编译器链,则使用cpan进行安装不成问题-尽管如果您不将相关模块上传到CPAN,则应调查local::lib

    请注意,GNOME libxml2未通过CPAN分发,必须通过其他方式获得。构建XML::LibXML模块还需要相应的头文件。

  • 您还可以使用像PAR这样的打包工具。这将创建一个可执行档案,其中包含您的perl解释器、源文件和任何依赖项。这些档案很大,因为它们包含整个perl。由于现在指定了perl版本,唯一剩下的变量是主机操作系统。请注意,这不会重用主机上的任何perl安装,并且必须自己带来所有内容。


我确实有一个C工具链 - 这就是Strawberry Perl的全部内容。扩展Strawberry Perl没有问题。操作系统也不是问题 - 它始终是64位Windows。我的问题是,我的用户将拥有Oracle Perl,我不知道如何扩展它,我也不想强制使用Strawberry Perl。 - Martin Drautzburg

0
“编译后的代码该怎么办?”
安装在 $arch-specific 目录中的代码只能与相同版本或更高版本的维护版本一起使用(例如,与 5.14.1 安装的特定于架构的模块将与 5.14.2 但不与 5.14.0 或 5.16 兼容)。它们只能与具有相同配置的 Perl 一起使用。除非您控制他们机器上的 Perl,否则这不太可能奏效。
“他们必须接受在机器上找到的任何东西。”
然而,您正在询问如何添加到他们的机器。那到底是哪一个呢?

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