[Vienna-pm] Module::Build und Anpassbarkeit

Angerer, Roland rangerer at verisign.com
Wed Feb 6 08:57:48 PST 2008


Hi,

Ich will in meinem Build.PL noch in ein paar Dateien spezielle Schlüsselwörter
ersetzen bevor diese installiert werden. Dabei handelt es sich z.B. um
Konfigurationen, die abhängig vom Rechner auf dem Build aufgerufen wird
unterschiedlich ersetzt werden sollen.

Derzeit habe ich das wie folgt gelöst und wundere mich, ob es das nicht alles
viel schöner schon gibt ...

my $class = Module::Build->subclass(code => <<'EOC');
    ## extending default ./Build action to modify files from build_customize
    sub ACTION_build {
        my ($self) = shift;

        $self->SUPER::ACTION_build(@_);

        my $files = $self->{'properties'}{'build_customize'};
        return unless keys %$files;

        local $/ = undef;

        foreach my $file (keys %$files) {
            my ($filename, $mode, $fh, $content, $changes);
            $filename = File::Spec->catfile($self->blib(), $file);
            $mode = (stat $filename)[2] & 07777; # read file mode to reset
after write
            open $fh, '<', $filename
                or die "unable to read file $filename: $!";
            $content = <$fh>;
            close $fh;
            foreach my $keyword (keys %{$files->{$file}}) {
                my ($replacement) = $files->{$file}{$keyword}{$ENV{'HOST'}};
                next unless $replacement;
                $content =~ s/$keyword/$replacement/;
                $changes++;
            }
            chmod 0600, $filename; # set file to be writeable by user
            open $fh, '>', $filename
                or die "unable to write file $filename: $!";
            print $fh $content;
            close $fh;
            chmod $mode, $filename; # set old permissions again

            print "Customizing $filename ($changes changes)\n";
        }
    }
EOC

my $builder = $class->new(
...
   build_customize => {
      'lib/Apache/MMPDownload.pm' => {
         '## CONFIG \(.*?\) ##' => {
             'HostA' => 'xxx',
             'HostB' => 'yyy',
         },
      },
   },
...
);

"Unschön" dabei ist mal (aus meiner Sicht)
- diese Ersetzung wird bei jedem Aufruf von ./Build (egal mit welchen
Parametern) gemacht
- Pfade zu den Dateien müssen sich an blib/ halten (also z.B. bin/ = script/)

lg, Roland

-------------------------------------------------------
Roland Angerer
Software Engineer
Mobile Application Services
rangerer at verisign.com
Direct: +43 (662) 45 00 03
Fax:    +43 (662) 45 00 03-55
Mobile: +43 (664) 808 41 515

VeriSign®
Jakob-Haringer Strasse 3
A-5020 Salzburg 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 4782 bytes
Desc: not available
Url : http://mail.pm.org/pipermail/vienna-pm/attachments/20080206/1c74da26/attachment.bin 


More information about the Vienna-pm mailing list