App-Tel
view release on metacpan or search on metacpan
local/lib/perl5/Module/Install/Bundle.pm view on Meta::CPAN
return $self->_install_bundled_dists unless $self->is_admin;
# Flatten array of arrays into a single array
my @core = map @$_, map @$_, grep ref, $self->requires;
$self->bundle(@core);
}
sub bundle {
my $self = shift;
return $self->_install_bundled_dists unless $self->is_admin;
$self->admin->bundle(@_);
}
sub auto_bundle_deps {
my $self = shift;
return $self->_install_bundled_dists unless $self->is_admin;
# Flatten array of arrays into a single array
my @core = map @$_, map @$_, grep ref, $self->requires;
while (my ($name, $version) = splice(@core, 0, 2)) {
next unless $name;
$self->bundle_deps($name, $version);
}
}
sub bundle_deps {
my ($self, $pkg, $version) = @_;
return $self->_install_bundled_dists unless $self->is_admin;
my $deps = $self->admin->scan_dependencies($pkg);
if (scalar keys %$deps == 0) {
# Probably a user trying to install the package, read the dependencies from META.yml
%$deps = ( map { $$_[0] => undef } (@{$self->requires()}) );
}
foreach my $key (sort keys %$deps) {
$self->bundle($key, ($key eq $pkg) ? $version : 0);
}
}
sub _install_bundled_dists {
my $self = shift;
# process bundle only the first time this function is called
return if $self->{bundle_processed};
$self->makemaker_args->{DIR} ||= [];
# process all dists bundled in inc/BUNDLES/
my $bundle_dir = $self->_top->{bundle};
foreach my $sub_dir (glob File::Spec->catfile($bundle_dir,"*")) {
next if -f $sub_dir;
# ignore dot dirs/files if any
my $dot_file = File::Spec->catfile($bundle_dir,'\.');
next if index($sub_dir, $dot_file) >= $[;
# EU::MM can't handle Build.PL based distributions
if (-f File::Spec->catfile($sub_dir, 'Build.PL')) {
warn "Skipped: $sub_dir has Build.PL.";
next;
}
# EU::MM can't handle distributions without Makefile.PL
# (actually this is to cut blib in a wrong directory)
if (!-f File::Spec->catfile($sub_dir, 'Makefile.PL')) {
warn "Skipped: $sub_dir has no Makefile.PL.";
next;
}
push @{ $self->makemaker_args->{DIR} }, $sub_dir;
}
$self->{bundle_processed} = 1;
}
1;
__END__
=pod
=head1 NAME
Module::Install::Bundle - Bundle distributions along with your distribution
=head1 SYNOPSIS
Have your Makefile.PL read as follows:
use inc::Module::Install;
name 'Foo-Bar';
all_from 'lib/Foo/Bar.pm';
requires 'Baz' => '1.60';
# one of either:
bundle 'Baz' => '1.60';
# OR:
auto_bundle;
WriteAll;
=head1 DESCRIPTION
Module::Install::Bundle allows you to bundle a CPAN distribution within your
distribution. When your end-users install your distribution, the bundled
distribution will be installed along with yours, unless a newer version of
the bundled distribution already exists on their local filesystem.
While bundling will increase the size of your distribution, it has several
benefits:
Allows installation of bundled distributions when CPAN is unavailable
Allows installation of bundled distributions when networking is unavailable
Allows everything your distribution needs to be packaged in one place
( run in 1.608 second using v1.01-cache-2.11-cpan-5735350b133 )