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

问题描述

我正在开发可在 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 等应用程序在安装发行版时可以在每个操作系统上成功运行?

解决方法

别担心;你可能已经做对了。

是的,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。对于支持它的客户来说,它可以使安装速度稍微快一点。