Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

robustly list any Perl code's module dependencies

by Aristotle (Chancellor)
on Oct 06, 2002 at 11:39 UTC ( #203148=sourcecode: print w/replies, xml ) Need Help??
Category: Utility Scripts
Author/Contact Info /msg Aristotle

I just read hans_moleman's script and thought there has to be a more robust way to do this that doesn't rely on parsing sources and has better support for recursive dependencies than just reporting whether a toplevel dependency is satisfied. This module is the surprisingly simple result. It relies on the fact that you can put coderefs in @INC.

Update: podmaster points out that not all pragmas are available everywhere, warnings being an obvious example, so they constitute a depency, too. I don't want to change the behaviour of this module however, therefor I added this to the CAVEATS section in the POD.

#!/usr/bin/perl -w
package ListDependencies;
use strict;
unshift @INC, sub {
        local $_ = $_[1];
        return unless /[[:upper:]]/;
        print STDERR $_, $/;

=head1 NAME - list any Perl code's module dependencies


perl -c -MListDependencies scriptname
perl -MListDependencies -MModule::Name -e1
perl -MListDependencies -e'use Module::Name'


This module prints the names of any modules any piece
of Perl code compiled after it tries to load to C<STDERR>,
but ignores C<use pragma;> directives. You should load
this module prior to all others. The C<-M> command line
switch to C<perl> is a good place to do so.

Note that it won't prevent execution of the code you're
trying to examine. If all you want to do is list
dependencies for a piece of standalone code, you may
want to use the C<-c> command line switch to C<perl> to
check compile time dependencies. Be aware that this will
leave you blind to any attempts to load modules
dynamically at runtime.

=head1 CAVEATS

If your own custom modules use all-lowercase names, this
module won't list them. This is intentional:
all-lowercase names are reserved for Perl pragmas.

Note that not all pragmas are available everywhere, so
they may constitute a depency as well. L<warnings> is an
obvious example.

=head1 BUGS

There is no way to specify a different output file handle
than C<STDERR>. A proper version should include an
C<import()> routine to take care of this.


The module only honours Unix, DOSish and MacOS directory
separators. A more portable solution would have to rely
on L<File::Spec>, but unfortunately that would require
this module to import modules itself.
Heisenberg's Dispersion Relation applies. :-)

=head1 AUTHOR

Aristotle Pagaltzis <pagaltzis at gmx dot de>


Copyright 2002. This may be modified and distributed on
the same terms as Perl.
Replies are listed 'Best First'.
Re: robustly list any Perl code's module dependencies
by simonflk (Pilgrim) on Oct 06, 2002 at 14:00 UTC

    This is a nice trick, but it won't work if the script or or any modules that are loaded do a use lib or unshift @INC

    Something like this should work, as long as require is not overriden elsewhere:

    package ShowDependencies; use strict; *CORE::GLOBAL::require = \&show_require; sub show_require (;$) { my $module = shift; print STDERR $module, $/; my $retval = eval "CORE::require( $module )"; die $@ if $@; return $retval; } 1;

    There is also a module (Module::Dependency) on the CPAN that builds a list of dependencies.

    update: added use strict

    -- simonflk

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://203148]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (3)
As of 2017-03-26 20:15 GMT
Find Nodes?
    Voting Booth?
    Should Pluto Get Its Planethood Back?

    Results (315 votes). Check out past polls.