Monday, May 19, 2014

Konfigurationsdateien für Perl-Programme ablegen

Und wieder einmal stehe ich vor der Frage: wohin mit der Konfigurationsdatei für mein Perl-Programm?

Ganz konkret geht es um minicpan - einem kleinen Programm zur Erstellung eines lokalen CPAN-Mirrors. Der ist ganz praktisch, wenn man unterwegs ist, mal kein Internet hat oder einfach keinen Bock darauf hat, schon wieder auf das Herunterladen der Module zu warten.

Wie minicpan auf Windows eingerichtet wird, wird auf diesen beiden Webseiten ganz gut erklärt:

Das Prinzip ist einfach. Es gibt schon alles, was für einen lokalen CPAN-Server benötigt wird: ein Modul CPAN::Mini und ein Programm namens minicpan. Wird das Modul CPAN::Mini installiert, dann steht auch minicpan zur Verfügung.

minicpan arbeitet mit einer Konfigurationsdatei. In dieser Konfigurationsdatei wird u.A. eingetragen, von welchen CPAN-Server die Module geladen werden sollen und wo die Module auf der lokalen Festplatte abgelegt werden:

# Hier werden die Module auf der Festplatte abgelegt:
local: D:/www/MINICPAN/

# remote = der Server, von dem die Module gezogen werden
# Kann z.B. einer aus dieser Liste sein: http://www.cpan.org/SITES.html
remote: http://mirror.optusnet.com.au/CPAN/


Die Konfigurationsdatei wird auf Windows über eine Umgebungsvariable CPAN_MINI_CONFIG bekannt gemacht. Der Wert der Umgebungsvariable ist der Pfad zur Konfigurationsdatei. Ist das geschehen, reicht ein Kommando aus, um einen lokalen CPAN-Spiegel zu erzeugen:

minicpan -f

Anschließend muss das Repository noch im Helferlein cpan eingetragen werden, damit die Module auch aus der lokalen Kopie installiert werden. In cpan kann man dazu die folgenden zwei Befehle ausführen:

conf urllist file:///D:/www/MINICPAN/
conf commit

Zurück zur ursprünglichen Frage: wohin mit der Konfigurationsdatei? Klar kann die irgendwo liegen. Aber gehört sie da auch hin? Leider habe ich keine Referenz gefunden, in der konkret drin stand, wo die Dateien hin müssen. Aber es gibt eine Seite von Microsoft, in der die diversen Orte für Konfigurationsdateien beschrieben werden (Hinweise auf eine bessere Seite sind gerne willkommen): Accessing app data with the Windows Runtime (Windows Runtime apps)

Da steht sozusagen, dass Konfigurationsdateien, die nur für das lokale Gerät und den lokalen Benutzer gedacht sind, in %localappdata% rein sollten:

Local app data

Local app data should be used for any information that needs to be preserved between app sessions and is not suitable type or size wise, for roaming app data. Data that is not applicable on other devices should be stored here as well. There are no general size restriction on local data stored. Location is available via the localFolder property. Use the local app data store for data that it does not make sense to roam and for large data sets.

Das wiederum ist ganz praktisch, denn das Modul File::HomeDir nennt genau den Pfad zu %localappdata% als Ort für my_data, also Daten einer Applikation für den aktuellen Benutzer:

my_data

The my_data method takes no arguments and returns the directory where local applications should stored their internal data for the current user.

File::HomeDir ist generell ein ganz interessantes Modul. Es erlaubt plattformunabhängig die richtigen Verzeichnisse für Benutzerdaten zu finden. Hier ein kleines Beispiel für den  Nutzer root:


Quellcode:

#!perl

use strict;
use warnings;
use File::HomeDir;
use Tkx;

my $mw = Tkx::widget->new(".");
my $row = 0;
my @mnames = <my_home my_desktop my_documents my_music my_pictures my_videos my_data>;
foreach my $method_name ( @mnames ) {
    my $namel = $mw->new_ttk__label(-text => $method_name, -justify => 'left');
    $namel->g_grid(-row => $row, -column => 0, -sticky => 'we');
   
    my $vall = $mw->new_ttk__label(
        -text => File::HomeDir->$method_name,
        -justify => 'left',
    );
    $vall->g_grid(-row => $row, -column => 1, -sticky => 'we');
   
    $row++;
}

Tkx::MainLoop;


Sollte man nun also auf die Idee kommen, Windows-Nutzern eine kleine Applikation zur Konfiguration des lokalen CPAN-Mirros zu schreiben - idealerweise mit einer Möglichkeit die Module zu definieren, die überhaupt gespiegelt werden sollen, einer Möglichkeit eigene Module per CPAN::Mini::Inject einzubauen - dann weiß man jetzt auch, wo die Konfigurationsdatei dafür liegen muss.

No comments: