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

标签 perl cpan makemaker

我正在开发可以在 Win32 和 *nix 上运行的 CPAN 发行版。然而,为了让它在 Win32 上工作,它需要另一个只能安装在 Win32 上的 CPAN 分发(模块)。
问题在于,通过将该模块声明为依赖项,它无法安装在 *nix 机器上。但它不会在 *nix 机器上真正使用/需要,只有在 Win32 上运行时。
我的发行版使用 ExtUtils::MakeMaker并在自动生成的哈希中配置依赖项 %WriteMakefileArgs .
我试过编辑 Makefile.PL根据运行它的操作系统添加或删除依赖项。但是,这对于 META.json 的生成并不真正起作用。和 META.yml ,这是基于我最终执行的操作系统生成的 make dist .如果我在 Windows 上运行它,那么仅 Win32 的依赖项会添加到这些文件中并破坏 *nix 安装。如果我在 *nix 上运行它,则不会添加依赖项,并且当测试分发的时间到来时,它可能会破坏 Win32 上的安装。
有没有办法为特定的操作系统定义不同的依赖关系,就像 CPAN 这样的应用程序一样或 CPANminus安装发行版时可以在每个操作系统上成功运行吗?

最佳答案

别担心;你可能已经做对了一切。
是的,META.json只会反射(reflect) Makefile.PL 在您自己的机器上检测到的依赖项,因此假设您正在 Linux 上构建发行版并将其上传到 CPAN,META.json在 CPAN 上不会反射(reflect) 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。对于支持它的客户端,它可以使安装速度稍微快一点。
  • 关于perl - 有没有办法让操作系统在 CPAN 发行版中定义依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67250819/

    相关文章:

    regex - 如何使用正则表达式去除字符串中多余的空格

    linux - @INC XFileSharing 2.5 中的 Perl 错误 : Can't locate XFileConfig. pm

    Perl:使用 Text::CSV 我可以写出哈希引用吗?

    perl - ExtUtils::MakeMaker 自定义目标

    unit-testing - 我如何告诉 Makemaker 并行运行测试?

    仅需要 v5.10 时 Perl v5.16 被拒绝

    linux - 从多个 .tar.gz 文件中提取特定文件名以构建一个 .csv 文件

    perl - Try::Tiny:try-catch 的奇怪行为与否?

    perl - 如何修复 Math::BigInt 调用的 Math::Pari 中的 "` as_number' 不是 Pari 函数名称?