我应该如何分发预构建的 perl 模块,以及我构建的 perl 版本是啥?

Posted

技术标签:

【中文标题】我应该如何分发预构建的 perl 模块,以及我构建的 perl 版本是啥?【英文标题】:How should I distribute a pre-built perl module, and what version of perl do I build for?我应该如何分发预构建的 perl 模块,以及我构建的 perl 版本是什么? 【发布时间】:2010-03-05 17:55:16 【问题描述】:

这可能是一个多部分的问题。背景:我们有一个本地 (c++) 库,它是我们应用程序的一部分,我们已经设法使用 SWIG 为这个库生成一个 perl 包装器。我们现在想将这个 perl 模块作为我们应用程序的一部分进行分发。

我的第一个问题 - 我应该如何分发这个模块?有没有标准的方法来打包预先构建的 perl 模块?我知道 ActiveState 发行版有 ppm,但我还需要为 linux 系统分发它。我什至不确定分发需要哪些文件,但我猜至少是 pm 和 so 文件。

我的下一个问题 - 看起来我可能需要为我想要支持的每个版本的 perl 构建我的模块项目。我怎么知道我应该为哪个 perl 版本构建?是否有任何标准指南......或者更好的方法来构建一个可以与多个版本的 perl 一起使用的包?

对不起,如果我的问题没有意义 - 我对 perl 的编译模块方面相当陌生。

澄清:底层编译源是专有(封闭源),所以我不能只为包提供源代码和适当的制作工件。希望我能,但在这种情况下不会发生。因此,我需要一个合理的方案来为我的模块打包预构建的二进制文件。

【问题讨论】:

见***.com/questions/2201637/… 这有点不同——预编译的二进制发行版与标准的基于 CPAN 的发行版。话虽如此,这是一个很好的资源。 【参考方案1】:

我负责 DBD::Informix,它是与 DBI(Perl 数据库接口)一起工作的 Perl 数据库驱动程序模块之一。用于连接到 IBM Informix Dynamic Server (IDS) 的底层库是专有的,但 DBD::Informix 代码本身不是。我在 CPAN 上分发该代码,就像任何其他 Perl 模块一样。人们可以下载该源代码,并且(前提是他们在他们的机器上安装了 Informix ClientSDK - 以及 Perl 和 DBI 等),他们可以构建 DBD::Informix 以使用他们安装的 Perl。

我强烈建议您安排您的 Perl 接口代码以源代码形式提供,即使它接口的库是专有的。这允许人们使用他们拥有的任何版本的 Perl 安装代码 - 而无需您处理不一致的问题。

如果你仍然想提供二进制支持,你将不得不确定你想支持哪些平台,并在每个这样的平台上使用标准版本的 Perl 构建模块。这变得一团糟。您需要访问每台机器的实例。诚然,虚拟机使这更容易,但它仍然很繁琐,平台和版本的数量只会增加。但是你仍然需要支持那些不在他们的机器上使用标准版本 Perl 的人——这就是为什么需要以源代码形式提供 Perl 包装器接口的原因。

【讨论】:

我没有想到...但是,是的,我认为我们可以将我们的专有内容分发到一个库(共享或静态)中,并将 SWIG 生成的代码作为可构建模块提供。 【参考方案2】:

免责声明: 我几乎没有创建可以轻松安装的二进制包的经验。因此,我将这篇文章 CW 发布,以便其他人更容易添加他们的建议。

您应该以源代码形式提供分发,以便可以在根据该系统的具体情况定制的每个系统上对其进行编译。为此,我真的很喜欢Module::Build。

对于 Windows 上的 ActiveState 用户,您可能需要四个或六个 PPM,具体取决于您是否要支持 5.6。为 5.65.85.10 分别打包 32 位和 64 位版本。使用您可以使用ppm 安装的mingw 版本来编译模块以保持二进制兼容性。

另一种选择是使用 PAR::Packer 并将您的应用程序分发到 PAR 存档中。在这种情况下,PAR::WebStart 可能有用,尽管我没有尝试过。不过,我过去曾在 PAR 档案方面取得过成功。

【讨论】:

以上是关于我应该如何分发预构建的 perl 模块,以及我构建的 perl 版本是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用预构建的内核输出目录构建 linux 内核模块?

如何使用预构建的内核输出目录构建Linux内核模块?

我可以使用基于 ExtUtils::MakeMaker 的构建系统“树外”构建 Perl 模块吗?

如何在多模块 Gradle 项目中构建分发包?

在模块(分发?)级别强制执行 API 边界

如何构建和分发依赖于第三方 libFoo.so 的 Python/Cython 包