NAME
App::PrereqGrapher - generate dependency graph using Perl::PrereqScanner
SYNOPSIS
use App::PrereqGrapher;
my %options = (
format => 'dot',
no_core => 0,
no_recurse_core => 1,
output_file => 'prereqs.dot',
verbose => 0,
);
my $grapher = App::PrereqGrapher->new( %options );
$grapher->generate_graph('Module::Path');
DESCRIPTION
App::PrereqGrapher builds a directed graph of the prereqs or dependencies for a file or module. It uses Perl::PrereqScanner to find the dependencies for the seed, and then repeatedly calls Perl::PrereqScanner on those dependencies, and so on, until all dependencies have been found.
It then saves the resulting graph to a file, using one of the five supported formats. The default format is 'dot', the format used by the GraphViz graph drawing toolkit.
If your code contains lines like:
require 5.006;
use 5.006;
Then you'll end up with a dependency labelled perl 5.006; this way you can see where you're dependent on modules which require different minimum versions of perl.
METHODS
new
The constructor understands the following options:
- format
-
Select the output format, which must be one of: dot, svg, vcg, gml, or html. See "OUTPUT FORMATS" for more about the supported output formats. If not specified, the default format is 'dot'.
- output_file
-
Specifies the name of the file to write the dependency graph into, including the extension. If not specified, the filename will be
dependencies
, with the extension set according to the format. - depth
-
Only generate the graph to the specified depth. If the complete dependency graph is very large, this option may help you get an overview.
- no_core
-
Don't include any modules which are core (included with perl) for the version of perl being used.
- no_recurse_core
-
When a core module is used, include it in the dependency graph, but don't show any of its dependencies.
- timeout
-
Specifies the timeout for Graph::Easy when its laying out the graph. This is mainly relevant for formats like SVG and HTML, where the graph layout is done in Perl. Defaults to 5 seconds.
- verbose
-
Display verbose logging as the grapher runs. Currently this will just tell you if a module was use'd or require'd, but couldn't be found locally.
generate_graph
Takes one or more seed items. Each item may be a module or the path to a perl file.
$grapher->generate_graph('Module::Path', 'Module::Version');
It will first try and interpret each item as a module, but if it can't find a module with the given name, it will try and interpret it as a file path. This means that if you have a file called strict
for example, then you won't be able to run:
$grapher->generate_graph('strict');
as it will be interpreted as the module of that name. Put an explicit path to stop this:
$grapher->generate_graph('./strict');
OUTPUT FORMATS
- dot
-
The format used by GraphViz and related tools.
- svg
-
Scalable Vector Graphics (SVG) a W3C standard. You have to install Graph::Easy::As_svg if you want to use this format.
- vcg
-
The VCG or GDL format.
- gml
-
Graph Markup Language, aka GraphML.
- html
-
Generate an HTML format with embedded CSS. I haven't been able to get this to work, but it's one of the formats supported by Graph::Easy.
KNOWN BUGS
Perl::PrereqScanner uses PPI to parse each item. PPI has a hard-coded limit for the size of file it's prepared to parse (currently just over 1M). This means that very large files will be ignored; for example Perl::Tidy cannot be graphed, and if you try and graph a file that use's Perl::Tidy, then it just won't appear in the graph.
If a class isn't defined in its own file, then App::PrereqGrapher won't find it; for example Tie::StdHash is defined inside Tie::Hash. By default these are silently ignored, but if you use the -verbose option you'll get the following warning:
can't find Tie::StdHash - keeping calm and carrying on.
Perl::PrereqScanner parses code and makes no attempt to determine whether any of it would actually run on your platform. For example, one module might decide at run-time whether to require
Foo::Bar or Foo::Baz, and might never use Foo::Baz on your OS. But Perl::PrereqScanner will see both of Foo::Bar and Foo::Baz as pre-reqs.
TODO
Have an option to control what depth we should recurse to? You might only be interested in the dependencies of your code, and their first level of dependencies.
Show some indication that we're running. It can take a long time to run if your ultimate dependency graph is very large.
SEE ALSO
The distribution for this module contains a command-line script, prereq-grapher. It has its own documentation.
This module uses Perl::PrereqScanner to parse the source code, and Graph::Easy to generate and save the dependency graph.
If you want to generate SVG graphs, you need to have Graph::Easy::As_svg installed.
http://neilb.org/reviews/dependencies.html: a review of CPAN modules that can be used to get dependency information.
REPOSITORY
https://github.com/neilb/App-PrereqGrapher
AUTHOR
Neil Bowers <neilb@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2012 by Neil Bowers <neilb@cpan.org>.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.