有没有办法让 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.json
和META.yml
的生成并没有真正起作用,它们是基于我最终执行make dist
的OS生成的。如果我 运行 它在 Windows 上,那么 Win32-only 依赖项将添加到这些文件并破坏 *nix 安装。如果我 运行 它在 *nix 上,则不会添加依赖项,并且在测试分发版的时候可能会破坏 Win32 上的安装。
有没有一种方法可以为特定的 OS 定义不同的依赖关系,使得 CPAN
或 CPANminus
等应用程序可以在每个 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。对于支持它的客户端,它可以使安装速度稍快一些。
我正在开发可以在 Win32 和 *nix 上运行的 CPAN 发行版。但是,为了使其在 Win32 上运行,它需要另一个只能安装在 Win32 上的 CPAN 发行版(模块)。
问题在于,通过将该模块声明为依赖项,它无法安装在 *nix 机器上。但是在 *nix 机器上它不会真的 used/required,只有在 Win32 上 运行ning 时才会。
我的发行版使用 ExtUtils::MakeMaker
并在自动生成的散列中配置依赖项 %WriteMakefileArgs
。
我已经尝试编辑 Makefile.PL
以添加或删除基于 OS 运行 的依赖项。然而,这对于META.json
和META.yml
的生成并没有真正起作用,它们是基于我最终执行make dist
的OS生成的。如果我 运行 它在 Windows 上,那么 Win32-only 依赖项将添加到这些文件并破坏 *nix 安装。如果我 运行 它在 *nix 上,则不会添加依赖项,并且在测试分发版的时候可能会破坏 Win32 上的安装。
有没有一种方法可以为特定的 OS 定义不同的依赖关系,使得 CPAN
或 CPANminus
等应用程序可以在每个 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。对于支持它的客户端,它可以使安装速度稍快一些。