/usr/bin/cpanfile-dump is in libmodule-cpanfile-perl 1.0002-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | #!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if 0; # not running under some shell
use strict;
use warnings;
use CPAN::Meta::Requirements;
use Module::CPANfile;
use Getopt::Long qw(:config posix_default no_ignore_case gnu_compat);
my @phases = qw(configure build test develop runtime);
my @types = qw(requires recommends suggests conflicts);
my %o = map { $_ => 1 } qw/configure build test runtime requires recommends/;
GetOptions(
"h|help", \$o{help},
"with-feature=s@", \$o{with},
"without-feature=s@", \$o{without},
"with-all-features", \$o{with_all},
map { ("$_!", \$o{$_}) } (@phases, @types),
);
if ($o{conflicts}) {
delete $o{$_} for qw/requires recommends suggests/;
}
if ($o{help}) {
if (eval { require Pod::Usage; 1 }) {
Pod::Usage::pod2usage(1);
} else {
die "Usage: cpanfile-dump\n\nSee perldoc cpanfile-dump for more details.\n";
}
}
my $file = Module::CPANfile->load("cpanfile");
my %excludes = map { $_ => 1 } @{$o{without}};
my @features = grep { !$excludes{$_} } $o{with_all}
? ( map { $_->identifier } $file->features )
: @{$o{with}};
my $prereqs = $file->prereqs_with( @features ); # CPAN::Meta::Prereqs object
my $merged = CPAN::Meta::Requirements->new;
for my $phase ( @phases ) {
next unless $o{$phase};
for my $type ( @types ) {
next unless $o{$type};
$merged->add_requirements( $prereqs->requirements_for( $phase, $type ) );
}
}
print "$_\n" for sort $merged->required_modules;
__END__
=head1 NAME
cpanfile-dump - Dump prerequisites from a cpanfile
=head1 SYNOPSIS
# Install typical required and recommended modules
cpan `cpanfile-dump`
# Skip configures phase
cpan `cpanfile-dump --no-configure`
# Also include develop phase and suggests type
cpan `cpanfile-dump --develop --suggests`
# Include a feature
cpan `cpanfile-dump --with-feature=sqlite`
=head1 DESCRIPTION
This script reads prereqs from a F<cpanfile> and dumps a raw list of
them to standard output. This is useful for piping these as input to
another program such as C<cpan>, C<cpanm> or C<cpanp>.
By default, it prints configure, build, test and runtime requirements and
recommendations. Command line options can be used to modify the default
choices.
This script is distributed with L<Module::CPANfile> since version 1.0002.
=head1 OPTIONS
=over 4
=item --configure, --build, --test, --runtime, --develop
Specify the phase to include/exclude. Defaults to include all but
C<--develop> but you can exclude some phases by specifying the options with
C<--no-> prefix, like C<--no-configure>.
=item --requires, --recommends, --suggests, --conflicts
Specify the type to include/exclude. Defaults to include only C<--requires> and
C<--recommends> but you can exclude some types by specifying the options with
C<--no-> prefix, like C<--no-recommends>.
Specifying C<--conflicts> will turn off all other types (even if specified
on the command line).
=item --with-feature, --with-all-features, --without-feature
cpanfile-dump --with-feature=sqlite
cpanfile-dump --with-all-features --without-feature=yaml
Specify features to include in the dump. C<--with-feature> and C<--without-feature>
may be used more than once.
=back
=head1 NOTES
Because C<cpanm> supports reading cpanfile directly, instead of piping the output of this
program, you're recommended to use C<cpanm --installdeps .> to install modules from cpanfile.
=head1 AUTHOR
David Golden
=head1 SEE ALSO
L<Module::CPANfile> L<cpanfile> L<App::mymeta_requires>
=cut
|