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