Module-Extract-Use

 view release on metacpan or  search on metacpan

examples/extract_modules  view on Meta::CPAN

	$ extract_modules -0 filename [...]
	Getopt::StdModule::CoreListPod::Usageopenstrictwarnings

	# print the modules list as JSON
	$ extract_modules -j filename [...]
	[
		"Getopt::Std",
		"Module::CoreList",
		"Pod::Usage",
		"open",
		"strict",
		"warnings"
	]

	# print the modules list as a basic cpanfile
	# https://metacpan.org/pod/cpanfile
	$ extract_modules -c filename [...]
	requires 'Getopt::Std', '1.23';
	requires 'Module::CoreList';
	requires 'Pod::Usage';
	requires 'open';
	requires 'strict';
	requires 'warnings';

	# look for the file in PATH
	$ extract_modules -b some_program

=head1 DESCRIPTION

This script does not execute the code in the files it examines. It
uses the C<Module::Extract::Use> or C<Module::ExtractUse> modules
which statically analyzes the source without compiling or running it.
These modules cannot discover modules loaded dynamically through a
string eval.

=head2 Command-line options

=over 4

=item * -b  look for filename in current directory or in PATH

=item * -c  cpanfile output

=item * -e  exclude core modules

=item * -j  JSON output

=item * -l  succinct list, one module per line

=item * -0  succinct list, modules null separated (for xargs -0)

=cut

run(@ARGV) unless caller;

sub run {
	my @args = @_;

	my %opts;
	{
	local @ARGV = @args;
	getopts('bcejl0', \%opts);
	@args = @ARGV;
	}

	# if no parameters are passed, give usage information
	unless( @args ) {
		require Pod::Usage;
		Pod::Usage::pod2usage( msg => 'Please supply at least one filename to analyze' );
		exit;
		}

	use Data::Dumper;
	my( $object, $method, $sub );
	my @classes = qw( Module::Extract::Use Module::ExtractUse );
	my %methods = (
		'Module::Extract::Use' => [ 'get_modules_with_details', sub {
			[ $_[0]->module, $_[0]->version ];
			} ],
		'Module::ExtractUse' => [ 'extract_use', sub {
			say Dumper( \@_ );
			[ $_[0], undef ];
			} ],
		);

	foreach my $module ( @classes ) {
		eval "require $module";
		next if $@;
		( $object, $method, $sub ) = ( $module->new, @{ $methods{$module} } );
		}

	die join(
			"\n\t",
			"Install one of these modules to make this program work:",
			sort keys %methods
			) . "\n"
		unless defined $object;

	if( $opts{'b'} ) {
		require Config;
		my @dirs = split /\Q$Config::Config{'path_sep'}/, $ENV{'PATH'};

		my @found_args;
		FILE: foreach my $file ( @args ) {
			if( -e $file ) {
				push @found_args, $file;
				next FILE;
				}

			foreach my $dir ( @dirs ) {
				print STDERR "Looking in $dir\n";
				my $path = catfile $dir, $file;
				if( -e $path ) {
					push @found_args, $path;
					next FILE;
					}
				}
			}

		@args = @found_args;
		}



( run in 1.250 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )