diff options
author | Tatsuhiko Miyagawa <miyagawa@bulknews.net> | 2013-08-09 18:13:43 -0700 |
---|---|---|
committer | Tatsuhiko Miyagawa <miyagawa@bulknews.net> | 2013-08-09 18:13:43 -0700 |
commit | 3928a832e632e7c2b7c4427da83d4adcba2bd440 (patch) | |
tree | 88981f03591690db9586d89ef361fae3b96cd399 /lib | |
parent | 46f0c433a5573c6572dcf4c649026e8c42de4449 (diff) | |
download | carton-3928a832e632e7c2b7c4427da83d4adcba2bd440.tar.gz |
Beta: install fatpacked carton in vendor/bin Fix #109
It also fatpackes cpanm's fatscript, and runs that by saving it to a
temp file with Module::Reader from fatpack.
Meta-Fatpacking!
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Carton/Builder.pm | 26 | ||||
-rw-r--r-- | lib/Carton/CLI.pm | 3 | ||||
-rw-r--r-- | lib/Carton/Environment.pm | 5 | ||||
-rw-r--r-- | lib/Carton/Packer.pm | 46 |
4 files changed, 76 insertions, 4 deletions
diff --git a/lib/Carton/Builder.pm b/lib/Carton/Builder.pm index 19cfb0a..9b89b34 100644 --- a/lib/Carton/Builder.pm +++ b/lib/Carton/Builder.pm @@ -1,13 +1,14 @@ package Carton::Builder; use strict; -use Module::Metadata; use Moo; +no warnings 'once'; has mirror => (is => 'rw'); has index => (is => 'rw'); has cascade => (is => 'rw', default => sub { 1 }); has without => (is => 'rw', default => sub { [] }); has cpanfile => (is => 'rw'); +has fatscript => (is => 'lazy'); sub effective_mirrors { my $self = shift; @@ -85,12 +86,29 @@ sub update { ) or die "Updating modules failed\n"; } +sub _build_fatscript { + my $self = shift; + + my $fatscript; + if ($Carton::Fatpacked) { + require Module::Reader; + my $content = Module::Reader::module_content('App::cpanminus::fatscript') + or die "Can't locate App::cpanminus::fatscript"; + $fatscript = Path::Tiny->tempfile; + $fatscript->spew($content); + } else { + require Module::Metadata; + $fatscript = Module::Metadata->find_module_by_name("App::cpanminus::fatscript") + or die "Can't locate App::cpanminus::fatscript."; + } + + return $fatscript; +} + sub run_cpanm { my($self, @args) = @_; local $ENV{PERL_CPANM_OPT}; - my $path = Module::Metadata->find_module_by_name("App::cpanminus::fatscript") - or die "Can't locate App::cpanminus::fatscript."; - !system $^X, $path, "--quiet", "--notest", @args; + !system $^X, $self->fatscript, "--quiet", "--notest", @args; } 1; diff --git a/lib/Carton/CLI.pm b/lib/Carton/CLI.pm index 652c0d4..8679ec4 100644 --- a/lib/Carton/CLI.pm +++ b/lib/Carton/CLI.pm @@ -157,6 +157,9 @@ sub cmd_bundle { ); $builder->bundle($env->install_path, $env->vendor_cache, $env->snapshot); + require Carton::Packer; + Carton::Packer->new->fatpack_carton($env->vendor_bin); + $self->printf("Complete! Modules were bundled into %s\n", $env->vendor_cache, SUCCESS); } diff --git a/lib/Carton/Environment.pm b/lib/Carton/Environment.pm index 3253b8b..a1464e2 100644 --- a/lib/Carton/Environment.pm +++ b/lib/Carton/Environment.pm @@ -38,6 +38,11 @@ sub _build_tree { Carton::Tree->new(cpanfile => $self->cpanfile, snapshot => $self->snapshot); } +sub vendor_bin { + my $self = shift; + $self->vendor_cache->parent->child('bin'); +} + sub build_with { my($class, $cpanfile) = @_; diff --git a/lib/Carton/Packer.pm b/lib/Carton/Packer.pm new file mode 100644 index 0000000..c1554cd --- /dev/null +++ b/lib/Carton/Packer.pm @@ -0,0 +1,46 @@ +package Carton::Packer; +use strict; +use App::FatPacker; +use File::pushd (); +use Path::Tiny (); + +use Moo; + +sub fatpack_carton { + my($self, $dir) = @_; + + my $temp = Path::Tiny->tempdir; + my $pushd = File::pushd::pushd $temp; + + my $file = $temp->child('carton.pre.pl'); + + $file->spew(<<'EOF'); +#!/usr/bin/env perl +use strict; +use 5.008001; +use Carton::CLI; +$Carton::Fatpacked = 1; +exit Carton::CLI->new->run(@ARGV); +EOF + + my $packer = App::FatPacker->new; + + my @modules = split /\r?\n/, $packer->trace(args => [$file], use => ['App::cpanminus']); + + my @packlists = $packer->packlists_containing(\@modules); + $packer->packlists_to_tree(Path::Tiny->new('fatlib')->absolute, \@packlists); + + my $fatpacked = do { + local $SIG{__WARN__} = sub {}; + $packer->fatpack_file($file); + }; + + my $executable = $dir->child('carton'); + warn "Bundling $executable\n"; + + $dir->mkpath; + $executable->spew($fatpacked); + chmod 0755, $executable; +} + +1; |