给定perl分发文件,例如像Archive-Zip-1.30.tar.gz
这样的文件,确定分发需要哪些先决条件(即其他perl模块)的现代方法是什么?
我想这个过程就像:
Makefile.PL
文件,那么...... Build.PL
文件,那么...... 或者可能有一个模块?
我应该补充一点,我对perl代码感兴趣以列出依赖项。
更新:我想答案只是查看应该包含在每个dist文件中的META.json
或META.yml
文件。
Update2:并非每个dist文件都有META文件。请参阅下面的答案,了解如何生成它们。
答案 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)
这是我能够确定的。也许这澄清了我的问题。
如果dist中有META.yml
或META.json
文件,您可以从其中任何一个文件中获取模块要求。
如果有Makefile.PL
,您可以使用以下代码生成META.yml
:
perl Makefile.PL; make metafile
这将在META.yml
子目录中创建DISTVNAME
。 DISTVNAME
定义为{distname}-{distversion}
,即Archive-Zip-1.30.tar.gz
DISTVNAME
为Archive-Zip-1.30
。
如果有Build.PL
个文件,您可以使用以下方式生成MYMETA.yml
文件:
perl Build.PL
将在当前工作目录中创建MYMETA.yml
文件。
较旧的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 = ...
非常愚蠢,但我不确定有更好的方法。