I'm getting ready to try to deploy some code to multiple machines. As far as I know, using a Makefile.pm
to track dependencies is the best way to ensure they are installed everywhere. The problem I have is I'm not sure our Makefile.pm
has been updated as this application has passed through a few different developers.
Is there any way to automatically parse through either my source or a few full runs of my program to determine exactly what versions of what modules my application is depending on? On top of that, is there any way to filter it based on CPAN packages? (So that I only depend on Moose instead of every single module that comes with Moose.)
A third related question is, if you depend on a version of a module that is not the latest, what is the best way to have someone else install it? Should I start including entire localized Perl installations with my application?
Just to be clear - you can not generically get a list of modules that the app depends on by code analysis alone. E.g. if your apps does eval { require $module; $module->import() }
, where $module
is passed via command line, then this can ONLY be detected by actually running the specific command line version with ALL the module values.
If you do wish to do this, you can figure out every module used by a combination of runs via:
Devel::Cover
. Coverage reports would list 100% of modules used. But you don't get version #s.
Print %INC
at every single possible exit point in the code as slu's answer said. This should probably be done in END{}
block as well as __DIE__
handler to cover all possible exit points, and even then may be not fully 100% covering in generic case if somewhere within the program your __DIE__
handler gets overwritten.
Devel::Modlist
(also mentioned by slu's answer) - the downside compared to Devel::Cover
is that it does NOT seem to be able to aggregate a database across multiple sample runs like Devel::Cover
does. On the plus side, it's purpose-built, so has a lot of very useful options (CPAN paths, versions).
Please note that the other module (Module::ScanDeps
) does NOT seem to allow you to do runtime analysis based on arbitrary command line arguments (e.g. it seems at first glance to only allow you to execute the program with no arguments) and if that's true, is inferior to all the above 3 methods for any code that may possibly load modules dynamically.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With