Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Automatic module installation

by Juerd (Abbot)
on May 23, 2002 at 08:03 UTC ( #168693=CUFP: print w/ replies, xml ) Need Help??

Let's assume you have a recent Perl and CPANPLUS installed. You want your brand new script to automatically install any modules that are not found. Well, maybe you don't. I'm sure I don't, but I couldn't resist the temptation and made Blah.pm. The module name describes exactly what it does, or... no it doesn't... but I needed a name.

My first try had a $SIG{__DIE__} handler and die "Try again :)\n", but it still didn't look nice. I did this because you cannot resurrect scripts. Kane had the idea of using exec($^X, $0, @ARGV) instead, which worked perfectly. But then, lathos suggested using a code ref in @INC. With the help of this node, I created this:

Blah.pm

use strict; use CPANPLUS; push @INC, sub { my ($code, $file) = @_; my $module = $file; $module =~ s!/!::!g; $module =~ s!\.pm$!!g; install($module); for (@INC) { next if ref; if (-e "$_/$file" and -r _) { open my $fh, '<', "$_/$file" or die $!; return $fh; } } return undef; };
Please note that real programmers don't use CPANPLUS but CPANPLUS::Backend, and use the great backend. I was lazy and used CPANPLUS with the simple install() function, but that is bad.

Example script:

use Blah; use Acme::Time::Baby; print babytime(), "\n";

Example output:

3;0 root@ouranos:/home/juerd/modtest# perl test.pl Checking if your kit is complete... Looks good Writing Makefile for Acme::Time::Baby PERL_DL_NONLAZY=1 /usr/bin/perl -Iblib/arch -Iblib/lib -I/usr/lib/perl +/5.6.1 -I/ usr/share/perl/5.6.1 -e 'use Test::Harness qw(&runtests $verbose); $ve +rbose=(eva l(chr(36).q(|=1))-1); runtests @ARGV;' t/*.t t/00_en..........ok t/01_du..........ok t/02_custom......ok t/03_noimport....ok t/04_chef........ok t/05_warez.......ok t/06_de..........ok t/07_fr..........ok t/08_no..........ok t/09_it..........ok All tests successful. Files=10, Tests=12972, 6 wallclock secs ( 2.33 cusr + 0.17 csys = 2 +.50 CPU) Installing of Acme::Time::Baby succesfull The big hand is on the eight and the little hand is on the ten 3;0 root@ouranos:/home/juerd/modtest# perl test.pl The big hand is on the nine and the little hand is on the ten

- Yes, I reinvent wheels.
- Spam: Visit eurotraQ.

Comment on Automatic module installation
Select or Download Code
Re: Automatic module installation
by Corion (Pope) on May 23, 2002 at 09:11 UTC

    Abigail once did something similar in Re: The Future - Managing Modules with The::Net, except that Abigail didn't use CPANPLUS and that the module is not available on CPAN for reasons unknown to me. So a possible name for your module might either be The::Net indeed, as The::Net might be unclaimed at the moment (ask Abigail about this :-) ) or The::Net::CPANPLUS, as that is what you do.

    perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The $d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider ($c = $d->accept())->get_request(); $c->send_response( new #in the HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web

      Abigail once did something similar in Re: The Future - Managing Modules

      I knew that already. That node helped me to understand subrefs in @INC.

      And no, this isn't ever going into CPAN. I'm not even going to use it. Just wanted it to be possible :)

      - Yes, I reinvent wheels.
      - Spam: Visit eurotraQ.
      

      Not available on CPAN? So, what's in http://www.cpan.org/modules/by-authors/Abigail/The_Net-1.1.tgz then? You won't find it when searching because 'The' isn't a registered namespace, and the search functionality isn't checking what has really been uploaded.

      Note that The::Net doesn't install the module - it will fetch it each time.

        Not available on CPAN?

        Sigh. Please do learn the difference between "this" and "that".
        This module (the one we're discussing named Blah.pm) will not enter CPAN. That module (the other, slightly off-topic one named The_Net) already has.

        Update - My mistake, as described by the anonymous reply.

        - Yes, I reinvent wheels.
        - Spam: Visit eurotraQ.
        

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: CUFP [id://168693]
Approved by crazyinsomniac
Front-paged by jmcnamara
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (10)
As of 2014-12-28 11:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (180 votes), past polls