从perl分发文件中获取模块依赖项?

时间:2013-08-08 18:16:06

标签: perl cpan

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

我想这个过程就像:

  1. 解压缩档案
  2. 如果找到Makefile.PL文件,那么......
  3. 如果找到Build.PL文件,那么......
  4. 或者可能有一个模块?

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

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

    Update2:并非每个dist文件都有META文件。请参阅下面的答案,了解如何生成它们。

3 个答案:

答案 0 :(得分:2)

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

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

如果您根据CPAN中的“最新”模块构建依赖关系图,请注意它可能会随着时间的推移而发生变化,因为CPAN的新版本可以随时更改其依赖关系。

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

答案 1 :(得分:1)

根据Dist :: Zilla的--listdeps命令的工作原理,我猜你会找 https://metacpan.org/module/CPAN::Meta::Requirements并在那里 requirements_for()。

答案 2 :(得分:1)

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

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

  2. 如果有Makefile.PL,您可以使用以下代码生成META.yml

    perl Makefile.PL; make metafile

    这将在META.yml子目录中创建DISTVNAMEDISTVNAME定义为{distname}-{distversion},即Archive-Zip-1.30.tar.gz DISTVNAMEArchive-Zip-1.30

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

    perl Build.PL

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

  4. 较旧的dist文件不具有META文件。例如,2001年的dist Digest-1.00.tar.gz (link)只有Makefile.PL个文件,而最新版Digest-1.17.tar.gz (link)包含META.yml个文件。< / p>

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

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

    DISTVNAME = ...
    

    非常愚蠢,但我不确定有更好的方法。