http://www.perlmonks.org?node_id=841605

Update: I've written Module::CheckDeps and checkdeps, so you can use them instead of this script.

Hi everybody. I needed a simple way to check script's dependencies.

Searching on PerlMonks I found two scripts (Check a script's module dependencies and robustly list any Perl code's module dependencies) but I think a better way to achieve that would be using the Module::ExtractUse module, so I wrote my version.

#!/usr/bin/perl # Usage: checkdeps.pl SCRIPT # Check Perl script's dependencies use Module::ExtractUse; use strict; my $script = $ARGV[0] or die "Usage: $0 SCRIPT\n"; open SCRIPT, $script or die "$!\n"; my $code = join "", <SCRIPT>; close SCRIPT; my $p = Module::ExtractUse -> new; $p -> extract_use(\$code); my @used = $p -> array; foreach my $module(@used) { eval "use $module"; next if !$@; print $module."\n"; }

It simply prints every modules not yet installed (one per line) on which the script depends, ready to feed the cpan script.

For example:

$ cpan `perl checkdeps.pl somescript.pl`

Any hints about the code?

Alex's Log - http://alexlog.co.cc

Replies are listed 'Best First'.
Re: Check script's dependencies
by runrig (Abbot) on May 25, 2010 at 17:51 UTC

      I tried the scandeps.pl script, but it takes a lot of time (also with the '-R' option active) and its output is not what I needed.

      Also the module is quite slow, so I found Module::ExtractUse more appropriate because of its "lightness".

      Alex's Log - http://alexlog.co.cc
Re: Check script's dependencies
by Khen1950fx (Canon) on May 27, 2010 at 06:26 UTC
    Interesting, but it doesn't work for me. I added Data::Dumper and took out the foreach and replaced it with print Dumper($p->used); Now it works for me.
    #!/usr/bin/perl # Usage: checkdeps.pl SCRIPT # Check Perl script's dependencies use strict; use warnings; use Module::ExtractUse; use YAML; use YAML::Dumper; my $script = $ARGV[0] or die "Usage: $0 SCRIPT\n"; open SCRIPT, $script or die "$!\n"; my $code = join "", <SCRIPT>; close SCRIPT; my $p = Module::ExtractUse->new; $p->extract_use(\$code); my $dumper = YAML::Dumper->new; $dumper->indent_width(4); my @used = $p->array; print $dumper->dump($p->used);

      Thank you for your help, but I think your code lost the main features I needed: the test on every module to check if it is installed and the "formatted output".

      I really don't understand what's wrong in my code, I tested it on both Linux (perl 5.10.1) and Windows XP (the latest strawberry perl). Has anyone more experienced than me any ideas?

      Alex's Log - http://alexlog.co.cc
Re: Check script's dependencies
by Anonymous Monk on Jun 15, 2010 at 18:02 UTC
    Might want to call it CheckUninstalledModules.pl