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

Is there a way to have dependencies defined by OS in a CPAN distribution?

我正在开发可以在 Win32 和 *nix 上运行的 CPAN 发行版。但是,为了使其在 Win32 上运行,它需要另一个只能安装在 Win32 上的 CPAN 发行版(模块)。

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

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

我已经尝试编辑 Makefile.PL 以添加或删除基于 OS 运行 的依赖项。然而,这对于META.jsonMETA.yml的生成并没有真正起作用,它们是基于我最终执行make dist的OS生成的。如果我 运行 它在 Windows 上,那么 Win32-only 依赖项将添加到这些文件并破坏 *nix 安装。如果我 运行 它在 *nix 上,则不会添加依赖项,并且在测试分发版的时候可能会破坏 Win32 上的安装。

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

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

是的,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 没有做任何“聪明”的事情,所以它可以跳过 运行ning Makefile.PL,使用 META.json 作为依赖项的最终列表,并猜测在何处安装任何包含的模块和脚本。并非所有 CPAN 客户端都支持此功能,所以无论如何都会 运行 Makefile.PL;所以你仍然需要包括 Makefile.PL。对于支持它的客户端,它可以使安装速度稍快一些。