[Vienna-pm] Module::Build install_path

Peter J. Holzer hjp-vienna-pm-list at hjp.at
Tue Oct 17 04:34:35 PDT 2006


On 2006-10-13 18:55:05 +0200, Thomas Klausner wrote:
> On Fri, Oct 13, 2006 at 06:11:50PM +0200, Peter J. Holzer wrote:
> > perl Build.PL install_base=/usr/local/simba
> > ./Build install
> > 
> > aufrufe, wird z.B. lib/Simba/DA.pm je nach Version von Module::Build
> > nach /usr/local/simba/lib/Simba/DA.pm oder
> > /usr/local/simba/lib/perl5/Simba/DA.pm installiert. 
> 
> Ich denke, dass letzteres der korrekte Wert ist. Ec koenntest du ja die
> Version von M:B als dependnecy angeben, die in das entsprechende dir
> installiert.

Vom Standpunkt des Modul-Autors ist mir egal, wohin es installiert wird,
es muss nur nachher auch wieder gefunden werden. Vom Standpunkt des
Sysadmins (und vielleicht auch des RPM- bzw. .deb-Bastlers) möchte ich
möglichst viel Kontrolle darüber haben, wohin das Zeug installiert wird.


> > Nur h?tte ich jetzt nat?rlich gern, dass in meinen Scripts ein 
> > use lib '/usr/local/simba/lib' bzw. use lib '/usr/local/simba/lib/perl5'
> > drinsteht, damit die Scripts ihre Module auch finden, ohne dass man das
> > Environment tweaken muss.
> > 
> > Kein Problem, dachte ich, ich subclasse einfach Module::Build, das wei?
> > wo es das Zeug hininstalliert hat, f?ge die "use lib" Zeile einfach im
> > ACTION_install ein (womit ich ein praktisches Beispiel f?r meine Frage
> > vom Perl-Workshop h?tte, ob man Scripts/Module mit Module::Build ?ndern
> > kann).
> > 
> > Dazu scheint die Funktion install_path gedacht zu sein, jedenfalls
> > verstehe ich die Doku so.
> 
> Ich glaub install_path ist eher dazu gedacht, den Pfad zu setzen.
> allerdings weiss ich das nicht wirklich.

Naja, die Methode ist an sich undokumentiert und wird nur in
Module::Build::Cookbook erwähnt. Dort klingt es eher so als ob der
Hauptzweck das Abfragen der Paths sei. 

Inzwischen habe ich noch eine weitere undokumentierte Methode namens
install_map gefunden, die den großen Vorteil hat, dass deren Ergebnis
direkt an ExtUtils::Install::install übergeben wird, das sollte es also
sein. Allerdings wird das auch nur bei neueren Versionen von
Module::Build vollständig ausgefüllt, ältere (z.B. die die bei Debian
Sarge dabei ist, verlassen sich offenbar darauf, dass
ExtUtils::Install::install sinnvolle defaults hat (allerdings verstehe
ich momentan nicht ganz, wie das funktionieren kann, denn der Ort ist ja
eben nicht default). 


> > Habe ich irgendwas einfaches ?bersehen, oder geht das wirklich nicht?
> 
> Das geht sicher irgendwie...
> 
> Hast du probiert, alle install places einzeln zu setzte?
> also
> ./Build install --install_base lib=/usr/local/simba/lib 
> ?

Naja, Zweck der Übung ist ja eigentlich, dass der User beliebige Pfade
angeben kann und das Build-Script die installierten Scripts und die
installierten Module konsistent hält - wenn ich dem User vorschreibe,
was er da alles anzugeben hat, kann ich die Pfade eigentlich auch gleich
vorgeben. (Ok, das ist schon eine Generalisierung des ursprünglichen
Problems, aber wenn ich mir sowas ansehe, dann versuche ich immer gleich
eine allgemein brauchbare Lösung zu finden).

Falls es wen interessiert, mein Build.pm schaut momentan so aus:

package Simba::Build;
use strict;
use warnings;

use Module::Build;
use Data::Dumper;

our @ISA = ('Module::Build');

sub ACTION_install {
    my $self = shift;
    print STDERR Dumper($self->install_map), "\n";
    my $lib = $self->install_map->{'blib/lib'};
    for my $script (glob('blib/script/*')) {
        open (my $in, '<', $script) or die "cannot open $script: $!";
        open (my $out, '>', "$script.$$") or die "cannot open $script.$$: $!";
        while (<$in>) {
            if (m{^use lib 'blib/lib'}) {
                print $out "use lib '$lib';\n";
            } else {
                print $out $_ or die "cannot write to $script.$$: $!";
            }
        }
        close $in or die "cannot close $script: $!";
        close $out or die "cannot close $script.$$: $!";
        rename "$script.$$", $script or die "cannot rename $script.$$ to $script: $!";
    }
    $self->SUPER::ACTION_install;
}

das Build.PL schaut so aus:

use warnings;
use strict;
use lib './lib';
use Simba::Build;

my $build = Simba::Build->new
    (
        module_name     => 'Simba',
        license         => 'perl',
        requires        => {
                           },
        script_files    => [
                                'da',
                           ],
    );
$build->create_build_script;

	hp

-- 
   _  | Peter J. Holzer    | Schlagfertigkeit ist das, was einem
|_|_) | Sysadmin WSR       | auf dem Nachhauseweg einfällt.
| |   | hjp at hjp.at         |    -- Lars 'Cebewee' Noschinski in dasr.
__/   | http://www.hjp.at/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://mail.pm.org/pipermail/vienna-pm/attachments/20061017/3aa7d323/attachment.bin 


More information about the Vienna-pm mailing list