有没有办法让操作系统在 CPAN 发行版中定义依赖关系?

Posted

技术标签:

【中文标题】有没有办法让操作系统在 CPAN 发行版中定义依赖关系?【英文标题】:Is there a way to have dependencies defined by OS in a CPAN distribution? 【发布时间】:2021-07-18 21:26:25 【问题描述】:

我正在开发一个可以在 Win32 和 *nix 上运行的 CPAN 发行版。然而,为了让它在 Win32 上工作,它需要另一个只能安装在 Win32 上的 CPAN 发行版(模块)。

问题在于,通过将该模块声明为依赖项,它无法安装在 *nix 机器上。但它不会在 *nix 机器上真正使用/需要,只有在 Win32 上运行时才需要。

我的发行版使用ExtUtils::MakeMaker 并在自动生成的哈希%WriteMakefileArgs 中配置依赖项。

我尝试编辑Makefile.PL 以根据运行它的操作系统添加或删除依赖项。但是,这对于META.jsonMETA.yml 的生成并不真正起作用,它们是基于我最终执行make dist 的操作系统生成的。如果我在 Windows 上运行它,那么只会将 Win32 依赖项添加到这些文件中并破坏 *nix 安装。如果我在 *nix 上运行它,则不会添加依赖项,并且可能会在测试分发时破坏 Win32 上的安装。

有没有一种方法可以为特定操作系统定义不同的依赖关系,以使CPANCPANminus 等应用程序在安装分发版时可以在每个操作系统上成功运行?

【问题讨论】:

【参考方案1】:

别担心;您可能已经做对了所有事情。

是的,META.json 只会反映 Makefile.PL 在您自己的机器上检测到的依赖关系,因此假设您在 Linux 上构建发行版并将其上传到 CPAN,CPAN 上的 META.json 不会反映Windows 依赖项。

但这没关系,因为当人们安装发行版时,他们的 CPAN 客户端不会使用 META.json 文件来安装依赖项。它将在最终用户的系统上重新运行 Makefile.PL,这将生成一个名为 MYMETA.json 的文件,如果它们在 Windows 上运行,该文件包含 Windows 依赖项,并使用依赖项来自MYMETA.json 而不是META.json


以下是书呆子的细节,你可能不需要担心:

META.json 包括一个名为 configure_requires 的部分,它列出的不是发行版的要求,而是 Makefile.PL 本身的要求;有时 Makefile.PL 会做一些复杂的事情并有自己的依赖关系。因为这些需要在运行 Makefile.PL 之前安装,所以 CPAN 客户端从 META.json 而不是 MYMETA.json 获取列表; MYMETA.json 还不存在。 可以在 META.json 中设置属性"dynamic_config": 0,它告诉 CPAN 客户端 Makefile.PL 没有做任何“聪明”的事情,因此它可以跳过运行 Makefile.PL,使用 META.json 作为依赖项的最终列表,并猜测安装任何包含的模块和脚本的位置。不是所有的 CPAN 客户端都支持这个,所以很多都会运行 Makefile.PL;所以你仍然需要包含 Makefile.PL。对于那些支持它的客户来说,它可以使安装速度稍微快一些。

【讨论】:

以上是关于有没有办法让操作系统在 CPAN 发行版中定义依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 CPAN 测试人员加载一个先决条件的开发版本?

如何告诉 CPAN 安装所有依赖项?

我可以重新测试所有已安装的 CPAN 模块吗?

Error:(16, 16) 警告: BASE64Decoder是内部专用 API, 可能会在未来发行版中删除

Linux程序管理:yum工具

有没有办法让自定义目标依赖于 CPack? [复制]