2

给定一个 perl 分发文件,例如一个类似 的文件Archive-Zip-1.30.tar.gz,确定分发需要哪些先决条件(即其他 perl 模块)的现代方法是什么?

我想这个过程是这样的:

  1. 解压存档
  2. 如果Makefile.PL找到文件,则...
  3. 如果Build.PL找到文件,则...

或者也许有一个模块?

我应该补充一点,我对 perl 代码感兴趣以列出依赖项。

更新:我想答案只是查看应该包含在每个 dist 文件中的META.jsonor文件。META.yml

更新 2:并非每个 dist 文件都有 META 文件。有关如何生成它们,请参阅下面的答案。

4

3 回答 3

2

如果您需要考虑模块的依赖关系,那么 META 可能还不够。根据我的经验,您通常需要了解整个依赖关系图才能做任何有用的事情。我不知道有一个单独的工具会递归地分析模块依赖关系,尽管你可能会在 CPAN 上找到一个并且当然可以自己做饭。

依赖信息也可以通过MetaCPAN API找到,因此这是另一种获取数据的方法,而无需实际从 CPAN 获取所有模块并查看它们的 META 文件。

如果您基于 CPAN 中的“最新”模块构建依赖关系图,请注意它可能会随着时间而改变,因为 CPAN 的新版本可以随时更改它们的依赖关系。

要获得更直观的答案,您可以在Stratopan.com上创建一个免费帐户并拉Archive-Zip-1.30.tar.gz入那里的存储库。然后你可以查看它生成的所有依赖关系的图表。是此类图表的一个示例。[免责声明:我经营 Stratopan.com]

于 2013-08-10T09:12:15.740 回答
1

这是我能够确定的。也许这澄清了我的问题。

  1. 如果 dist 中有META.ymlorMETA.json文件,您可以从其中任何一个文件中获取模块要求。

  2. 如果有Makefile.PL,您可以META.yml使用以下方法生成:

    perl Makefile.PL; make metafile

    这将META.ymlDISTVNAME子目录中创建。被DISTVNAME定义为,即{distname}-{distversion}对于 distArchive-Zip-1.30.tar.gz是。DISTVNAMEArchive-Zip-1.30

  3. 如果有Build.PL文件,您可以使用以下命令生成MYMETA.yml文件:

    perl Build.PL

    MYMETA.yml文件将在当前工作目录中创建。

较旧的 dist 文件没有 META 文件。例如,2001 年的 dist Digest-1.00.tar.gz (链接)只有一个Makefile.PL文件,而最新版本Digest-1.17.tar.gz (链接)包含一个META.yml文件。

这就提出了如何准确获取DISTVNAME具有Makefile.PL文件的 for dists 的问题。

似乎最好的方法是运行perl Makefile.PL然后解析Makefile一行,如下所示:

DISTVNAME = ...

非常笨拙,但我不确定是否有更好的方法。

于 2013-08-11T21:47:31.777 回答
1

从 Dist::Zilla 的 --listdeps 命令的工作原理来看,我猜你会在 https://metacpan.org/module/CPAN::Meta::Requirements中查找 requirements_for()。

于 2013-08-08T19:26:58.913 回答