6

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

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

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

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

有没有办法为特定操作系统定义不同的依赖项,以使应用程序在安装发行版时喜欢CPANCPANminus可以在每个操作系统上成功运行?

4

1 回答 1

7

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

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

但这没关系,因为当人们安装发行版时,他们的 CPAN 客户端不会使用该META.json文件来安装依赖项。它将在最终用户的系统上重新运行Makefile.PL ,MYMETA.json生成一个名为.MYMETA.jsonMETA.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。对于那些支持它的客户端,它可以使安装稍微快一点。
于 2021-04-25T09:04:39.620 回答