Thread Frage zu Handling von Config - Einträge (2 answers)
Opened by YAPD at 2019-06-06 19:59

haj
 2019-06-07 17:25
#190101 #190101
User since
2015-01-07
527 Artikel
BenutzerIn

user image
Hallo YAPD,

...weil ich an der Wahl von Moose nicht ganz unschuldig bin, versuche ich mal auf die Fragen einzugehen.

Es ist schon so wie rosti schreibt, dass Perl-Code als Konfigurations-Format unüblich (oder mit meinen Worten: "rustikal") ist. Es gibt auf CPAN (zu) viele Module, die Config-Dateien in allen möglichen und einigen unmöglichen Formaten bearbeiten, aber das verschiebe ich mal.

Eine Empfehlung vorneweg: Moose kann ... zu viel. Setze die Besonderheiten nur ein, wenn Du den Mehrwert jemand anderem erklären kannst. Der Kürze wegen lasse ich hier auch einige Sachen weg, die ich sonst grundsätzlich verwende.

Gleich ein Hinweis zu einem Unterschied zwischen Objekt und Hash, den Du auch schon festgestellt hast: Hash-Zugriffe werden in Strings interpoliert, Methodenaufrufe nicht. Dagegen ist leider nichts zu machen.
Code (perl): (dl )
1
2
3
-e "$Self->{Home}/Kernel/Config/Files/" # wird wie erwartet interpoliert
-e "$Self->Home()/Kernel/Config/Files/" # Hier wird nur $Self interpoliert.
-e ($Self->Home . "/Kernel/Config/Files/") # So geht's dann wieder.


Beim weiteren bin ich nicht ganz sicher, ob ich Deinen Anwendungsfall richtig verstanden habe, daher schreibe ich mal meine Annahmen auf:
  • Ich gehe mal davon aus, dass Du Deine gesamte Konfiguration als ein Objekt der Klasse Kernel::Config haben willst.
  • Du hast viele Einzeldateien mit Konfigurationsvariablen im Format $Self->{ WasAuchImmer }  = 'Es muss sein';
  • Welche Konfigurationsvariablen es überhaupt geben soll, entscheiden die Defaults-Konfigurationsdateien und nicht die Config-Module.
  • Du willst also nicht für jede einzelne Variable ein has schreiben.
  • Alle Konfigurationsvariablen taugen syntaktisch als Moose-Attribute (Beispiel: $Self->{'Database User'} taugt nicht)


Dann kann man Kernel::Config::Defaults wie folgt schreiben:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package Kernel::Config::Defaults;
use strict;

# ----------------------------------------------------------------------

sub Load_Defaults {
    my ($Config_Dir) = @_;

    our $Self = { DB_Handle => 'Microsoft SQL Server'};

    if ( -e "$Config_Dir" )
        {
            print "Positive Erkennung des Config - Files Ordners $Config_Dir\n";
            # Ich nehme an, hier wird noch mehr Zeug aus den Dateien
            # in den Hash eingetragen, hier einfach hart codiert:
            $Self -> { Database }     = 'Bezeichnung der DB';
            $Self -> { DatabaseUser } = 'Standard User';
            $Self -> { DatabasePw }   = 'XXXXXXXX';
        }
    else {
        die "Keine Defaults, keine Attribute.  Versuch's nochmal.";
    }

    return %$Self;

};

# ----------------------------------------------------------------------

1;

Ich habe Moose rausgeworfen. Wird ja nix genutzt davon. Und ich habe den Directory-Namen als Parameter übergehen und nicht fest einprogrammiert. Die Routine gibt gibt meinem Verständnis nach einen Hash mit 200 oder mehr Konfigurationsvariablen mit Default-Werten zurück, und die Aufgabe besteht nun darin, aus den Schlüsseln des Hash Attribute der Klasse Kernel::Config zu machen.

Das wird nun wie folgt in Kernel::Config eingebaut:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package Kernel::Config;

use Moose;

use Kernel::Config::Defaults;

# ------------------------------------------------------------------------

my $Home = $ENV{CONFIG_HOME} // 'C:\Scripts\Aktuell';

# ------------------------------------------------------------------------

has Home => (
    is => 'rw',
    default => $Home,
);

my %Config = Kernel::Config::Defaults::Load_Defaults($Home);

while (my ($attribute,$default) = each %Config) {
    has $attribute => (
        is => 'rw',
        default => $default,
    );
}

# --------------------------------------------------------------------------------

no Moose;

# ---------------------------------------------------------------------------------

__PACKAGE__ -> meta -> make_immutable;


Nebenbei: Man kann an has auch gleich eine Liste von Attributen übergeben:
Code (perl): (dl )
has => ([ keys %Config ], is => 'rw');
...dann sind allerdings keine Defaults versorgt.

Die Verwendung im Installer sieht dann so aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
use strict;
use Kernel::Config;

# ----------------------------------------------------------------------
my $Config = Kernel::Config -> new(DatabasePw => 'Geheim!!11!');
# -------------------------------------------------------------------

printf ("Value des Config - Werts Home:       %s\n", $Config->Home);
printf ("Value des Config - Werts Database:   %s\n", $Config->Database);
printf ("Value des Config - Werts DatabasePw: %s\n", $Config->DatabasePw);
printf ("Value des Config - Werts DB_Handle:  %s\n", $Config->DB_Handle);


...und die Ausgabe nach dem Aufruf mit CONFIG_HOME=/tmp:
Code: (dl )
1
2
3
4
5
Positive Erkennung des Config - Files Ordners /tmp
Value des Config - Werts Home: /tmp
Value des Config - Werts Database: Bezeichnung der DB
Value des Config - Werts DatabasePw: Geheim!!11!
Value des Config - Werts DB_Handle: Microsoft SQL Server


Hier siehst Du, welche Quellen für die Konfiguration herangezogen wurden: Home kommt aus der Umgebungsvariablen (ich will kein C:/Scripts bei mir einrichten), Database aus einer Defaults-Datei und DatabasePw aus dem Aufruf im Installer, hier wurde der Default also überschrieben. Auch wenn das nicht genau Deinen Einsatzfall trifft, sollte es Dir einen Überblick über die Möglichkeiten geben.

View full thread Frage zu Handling von Config - Einträge