有没有办法让操作系统在 CPAN 发行版中定义依赖关系?
Posted
技术标签:
【中文标题】有没有办法让操作系统在 CPAN 发行版中定义依赖关系?【英文标题】:Is there a way to have dependencies defined by OS in a CPAN distribution? 【发布时间】:2021-07-18 21:26:25 【问题描述】:我正在开发一个可以在 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
等应用程序在安装分发版时可以在每个操作系统上成功运行?
【问题讨论】:
【参考方案1】:别担心;您可能已经做对了所有事情。
是的,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。对于那些支持它的客户来说,它可以使安装速度稍微快一些。
【讨论】:
以上是关于有没有办法让操作系统在 CPAN 发行版中定义依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章