有没有办法让操作系统在CPAN发行版中定义依赖项?
我正在开发可以在 Win32 和 *nix 上运行的 CPAN 发行版。然而,为了让它在 Win32 上工作,它需要另一个只能安装在 Win32 上的 CPAN 分发(模块)。
问题在于,通过将该模块声明为依赖项,它无法安装在 *nix 机器上。但它不会在 *nix 机器上真正使用/需要,只有在 Win32 上运行时。
我的发行版ExtUtils::MakeMaker在自动生成的 hash 中使用和配置依赖项%WriteMakefileArgs。
我尝试Makefile.PL根据运行它的操作系统进行编辑以添加或删除依赖项。然而,这并没有真正用于产生工作META.json和META.yml,这是基于操作系统,我最终执行上产生的make dist。如果我在 Windows 上运行它,那么仅 Win32 的依赖项会添加到这些文件中并破坏 *nix 安装。如果我在 *nix 上运行它,则不会添加依赖项,并且当测试分发的时间到来时,它可能会破坏 Win32 上的安装。
有没有办法为特定的操作系统定义不同的依赖关系,使应用程序在安装发行版时喜欢CPAN或CPANminus可以在每个操作系统上成功运行?
回答
别担心;你可能已经做对了一切。
是的,它META.json只会反映 Makefile.PL 在您自己的机器上检测到的依赖项,因此假设您在 Linux 上构建发行版并将其上传到 CPAN,META.jsonCPAN 上的将不会反映 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还不存在。- 可以
"dynamic_config": 0在 META.json 中设置一个属性,它告诉 CPAN 客户端 Makefile.PL 没有做任何“聪明”的事情,因此它可以跳过运行 Makefile.PL,使用 META.json 作为依赖项的明确列表,以及猜测在哪里安装任何包含的模块和脚本。不是所有的 CPAN 客户端都支持这个,所以很多人还是会运行 Makefile.PL;所以你仍然需要包含 Makefile.PL。对于支持它的客户端,它可以使安装速度稍微快一点。