[carton] 401/472: Beta: install fatpacked carton in vendor/bin Fix #109
Lucas Kanashiro
kanashiro-guest at moszumanska.debian.org
Fri Jul 24 00:39:28 UTC 2015
This is an automated email from the git hooks/post-receive script.
kanashiro-guest pushed a commit to branch master
in repository carton.
commit 3928a832e632e7c2b7c4427da83d4adcba2bd440
Author: Tatsuhiko Miyagawa <miyagawa at bulknews.net>
Date: Fri Aug 9 18:13:43 2013 -0700
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!
---
cpanfile | 5 ++++-
lib/Carton/Builder.pm | 26 ++++++++++++++++++++++----
lib/Carton/CLI.pm | 3 +++
lib/Carton/Environment.pm | 5 +++++
lib/Carton/Packer.pm | 46 ++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 80 insertions(+), 5 deletions(-)
diff --git a/cpanfile b/cpanfile
index fcee8a4..4d89b23 100644
--- a/cpanfile
+++ b/cpanfile
@@ -24,9 +24,12 @@ requires 'CPAN::Meta', 2.120921;
requires 'CPAN::Meta::Requirements', 2.121;
requires 'Module::CoreList';
+requires 'App::FatPacker', 0.009018;
+requires 'File::pushd';
+requires 'Module::Reader', 0.002;
+
on develop => sub {
requires 'Test::More', 0.90;
requires 'Test::Requires';
requires 'Capture::Tiny';
- requires 'File::pushd';
};
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;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/carton.git
More information about the Pkg-perl-cvs-commits
mailing list