我正准备尝试将一些代码部署到多台计算机上。据我所知,使用Makefile.pm
跟踪依赖关系是确保它们安装在任何地方的最佳方法。我遇到的问题是我不确定我们的Makefile.pm
是否已更新,因为此应用程序已通过几个不同的开发人员。
有没有办法自动解析我的源程序或我的程序的几个完整运行,以确定我的应用程序所依赖的模块的确切版本?最重要的是,有没有办法根据CPAN包过滤它? (因此,我只依靠Moose而不是Moose附带的每个模块。)
第三个相关问题是,如果您依赖的是非最新版本的模块,那么让其他人安装它的最佳方法是什么?我应该开始在我的应用程序中包含整个本地化的Perl安装吗?
答案 0 :(得分:14)
为了清楚起见 - 您不能仅通过代码分析获得应用程序所依赖的模块列表。例如。如果您的应用程序eval { require $module; $module->import() }
,其中$module
通过命令行传递,则只能通过实际运行具有所有模块值的特定命令行版本来检测此情况。
如果您希望这样做,您可以通过以下方式找出运行组合使用的每个模块:
Devel::Cover
。覆盖率报告将列出100%使用的模块。但你没有版本#s。
在代码中的每个可能的退出点打印%INC
,如slu的回答所说。这可能应该在END{}
块以及__DIE__
处理程序中完成,以涵盖所有可能的退出点,即使这样,如果在程序中的某个位置{{1处理程序被覆盖。
__DIE__
(slu的答案也提到) - 与Devel::Modlist
相比的缺点是它似乎无法在多个样本运行中聚合数据库,如{{1} }。从好的方面来说,它是专门构建的,因此有很多非常有用的选项(CPAN路径,版本)。
请注意,其他模块(Devel::Cover
)似乎不允许您根据任意命令行参数进行运行时分析(例如,乍一看似乎只允许您执行程序没有参数)如果这是真的,那么对于任何可能动态加载模块的代码,它都不如以上3种方法。
答案 1 :(得分:5)
Module::ScanDeps - 递归扫描Perl代码以获取依赖关系
是静态扫描还是运行时扫描。只是模块,我不知道有什么确切的方法可以验证哪些版本来自哪些版本。您可以从BackPan获取旧包,或者只使用PAR打包整个本地依赖链。
答案 2 :(得分:2)
您可以查看%INC,请参阅http://www.perlmonks.org/?node_id=681911,其中也提及了Devel::Modlist
答案 3 :(得分:0)
我肯定会使用Devel :: TraceUse,它也会显示模块的树,因此很容易猜到它们的加载位置。