Nächste: , Nach oben: Persönliche Dienste   [Inhalt][Index]


13.3.1 Essenzielle Persönliche Dienste

Ein paar grundlegende Persönliche Dienste sind auch in (gnu home services) definiert; sie sind in erster Linie zur internen Nutzung und für die Erstellung der Persönlichen Umgebung gedacht, aber manche sind auch für Endanwender interessant.

Variable: home-environment-variables-service-type

Der Dienst mit diesem Diensttyp wird von jeder Persönlichen Umgebung automatisch instanziiert; so sind die Vorgabeeinstellungen. Sie müssen ihn also nicht definieren, aber vielleicht möchten Sie Ihn erweitern mit einer Liste von Paaren zum Festlegen von Umgebungsvariablen (englisch „Environment Variables“).

(list ("ENV_VAR1" . "Wert1")
      ("ENV_VAR2" . "Wert2"))

Es ist am einfachsten, ihn zu erweitern, ohne einen neuen Dienst zu definieren, nämlich indem Sie das simple-service-Helferlein aus dem Modul (gnu services) einsetzen.

(simple-service 'einige-hilfreiche-umgebungsvariable-service
		home-environment-variables-service-type
		`(("LESSHISTFILE" . "$XDG_CACHE_HOME/.lesshst")
                  ("SHELL" . ,(file-append zsh "/bin/zsh"))
                  ("USELESS_VAR" . #f)
                  ("_JAVA_AWT_WM_NONREPARENTING" . #t)
                  ("LITERAL_VALUE" . ,(literal-string "${abc}"))))

Wenn Sie einen solchen Dienst in die Definition Ihrer Persönlichen Umgebung aufnehmen, fügt das folgenden Inhalt in Ihr setup-environment-Skript ein (das von Ihrer Login-Shell gesourcet werden dürfte):

export LESSHISTFILE="$XDG_CACHE_HOME/.lesshst"
export SHELL="/gnu/store/2hsg15n644f0glrcbkb1kqknmmqdar03-zsh-5.8/bin/zsh"
export _JAVA_AWT_WM_NONREPARENTING
export LITERAL_VALUE='${abc}'

Sie sehen, wie wir hier mit literal-string deklarieren können, dass ein Wert als literale Zeichenkette aufgefasst werden soll, also dass „besondere Zeichen“ wie das Dollarzeichen darin nicht durch die Shell interpretiert werden sollen.

Anmerkung: Achten Sie darauf, dass das Modul (gnu packages shells) mit use-modules oder Ähnlichem importiert wird, denn durch den (gnu packages shells)-Namensraum wird die Definition des zsh-Pakets verfügbar gemacht, auf die obiges Beispiel Bezug nimmt.

Wir verwenden hier eine assoziative Liste (siehe Association Lists in Referenzhandbuch von GNU Guile). Das ist eine Datenstruktur aus Schlüssel-Wert-Paaren und für home-environment-variables-service-type ist der Schlüssel immer eine Zeichenkette und der Wert entweder eine Zeichenkette, ein G-Ausdruck für Zeichenketten (siehe G-Ausdrücke), ein dateiartiges Objekt (siehe dateiartige Objekte) oder ein Boolescher Ausdruck. Im Fall von G-Ausdrücken wird die Variable auf den Wert des G-Ausdrucks festgelegt, bei dateiartigen Objekten auf den Pfad der Datei im Store (siehe Der Store), bei #t wird die Variable ohne Wert exportiert und bei #f wird sie ganz weggelassen.

Variable: home-profile-service-type

Der Dienst dieses Typs wird durch jede Persönliche Umgebung automatisch instanziiert. Sie müssen ihn nicht erst definieren. Vielleicht wollen Sie ihn aber um eine Liste von Paketen erweitern, wenn Sie weitere Pakete in Ihr Profil installieren wollen. Wenn andere Dienste Programme für den Nutzer verfügbar machen müssen, erweitern diese dazu auch diesen Diensttyp.

Als Wert der Erweiterung muss eine Liste von Paketen angegeben werden:

(list htop vim emacs)

Hier können Sie den gleichen Ansatz wie bei simple-service (siehe simple-service) für home-environment-variables-service-type fahren. Achten Sie darauf, die Module mit den angegebenen Paketen über etwas wie use-modules zu importieren. Um ein Paket oder Informationen über das es enthaltende Modul zu finden, hilft Ihnen guix search (siehe guix package aufrufen). Alternativ können Sie specification->package einsetzen, um das Paketverbundsobjekt anhand einer Zeichenkette zu spezifizieren; dann brauchen Sie auch das zugehörige Modul nicht zu laden.

Es gibt noch mehr essenzielle Dienste, von denen wir aber nicht erwarten, dass Nutzer sie erweitern.

Variable: home-service-type

Die Wurzel des gerichteten azyklischen Graphen aus Persönlichen Diensten. Damit wird ein Verzeichnis erzeugt, auf das später die symbolische Verknüpfung ~/.guix-home verweist und das Konfigurationsdateien, das Profil mit Binärdateien und Bibliotheken sowie ein paar notwendige Skripte enthält, die die Dinge zusammenhalten.

Variable: home-run-on-first-login-service-type

Mit dem Dienst dieses Diensttyps wird ein Guile-Skript erzeugt, das von der Login-Shell ausgeführt werden soll. Es wird dabei nur dann ausgeführt, wenn eine besondere Signaldatei in XDG_RUNTIME_DIR nicht vorgefunden wird, wodurch das Skript nicht unnötig ausgeführt wird, wenn mehrere Login-Shells geöffnet werden.

Man kann den Diensttyp mit einem G-Ausdruck erweitern. Allerdings sollten Nutzer diesen Dienst nicht dazu gebrauchen, Anwendungen automatisch zu starten, denn das macht man besser über Erweiterungen des home-shepherd-service-type durch einen Shepherd-Dienst (siehe Shepherd-Dienste) oder über eine Erweiterung der von der Shell beim Start geladenen Datei um den benötigten Befehl und mittels des für diese Art Shell geeigneten Diensttyps.

Variable: home-files-service-type

Mit dem Dienst dieses Typs können Sie eine Liste von Dateien angeben, die in ~/.guix-home/files platziert werden; normalerweise stehen in diesem Verzeichnis Konfigurationsdateien (genauer gesagt stehen dort symbolische Verknüpfungen auf die eigentlichen Konfigurationsdateien in /gnu/store), die dann in $XDG_CONFIG_DIR oder in seltenen Fällen nach $HOME kopiert werden sollen. Der Dienst kann erweitert werden mit Werten im folgenden Format:

`((".sway/config" ,sway-dateiartig)
  (".tmux.conf" ,(local-file "./tmux.conf")))

Jede verschachtelte Liste enthält zwei Werte: ein Unterverzeichnis und ein dateiartiges Objekt. Nachdem Sie die Persönliche Umgebung erstellt haben, wird in ~/.guix-home/files der entsprechende Inhalt eingefügt und alle Unterverzeichnisse werden dazu erzeugt. Allerdings kümmert sich ein anderer Dienst darum, die Dateien dann weiter zu verteilen. Vorgegeben ist, dass ein home-symlink-manager-service-type die notwendigen symbolischen Verknüpfungen im Persönlichen Verzeichnis auf Dateien aus ~/.guix-home/files anlegt und Sicherungskopien bereits bestehender, im Konflikt stehender Konfigurationsdateien und anderer Dateien anlegt. Dieser symlink-manager gehört zu den essenziellen Persönlichen Diensten (die nach Vorgabeeinstellungen aktiviert sind), aber es ist möglich, dass Sie alternative Dienste benutzen, um fortgeschrittenere Anwendungsfälle wie ein nur lesbares Persönliches Verzeichnis hinzukriegen. Sie sind eingeladen, zu experimentieren und Ihre Ergebnisse zu teilen.

Häufig trifft man auf Benutzer von Guix Home, die zuvor ein anderes Verfahren zum Versionieren ihrer Konfigurationsdateien (d.h. ihrer Dotfiles) in einem einzelnen Verzeichnis benutzt haben, zusammen mit einer Technik, um Änderungen daran ins Persönliche Verzeichnis einzuspielen.

Mit dem Diensttyp home-dotfiles-service-type aus (gnu home services dotfiles) wird der Umstieg auf Guix Home für diese Nutzergruppe leicht gemacht. Dazu verweisen Sie einen Dienst dieses Typs auf das Verzeichnis mit den Dotfiles, damit Dotfiles automatisch ins Persönliche Verzeichnis des Benutzers übertragen werden, ohne dass auf die von Guix vorgegebene Struktur umgestellt werden müsste.

Bitte denken Sie daran, dass es eine gute Idee ist, die Dotfiles-Verzeichnisse unter Versionskontrolle zu stellen, zum Beispiel in demselben Repository, in dem Sie Ihre Guix-Home-Konfiguration organisieren.

Möglich sind bislang zwei Verzeichnislayouts für Dotfiles. Beim Layout 'plain wird folgende Struktur des Verzeichnisses erwartet:

~$ tree -a ./dotfiles/
dotfiles/
├── .gitconfig
├── .gnupg
│   ├── gpg-agent.conf
│   └── gpg.conf
├── .guile
├── .config
│   ├── guix
│   │   └── channels.scm
│   └── nixpkgs
│       └── config.nix
├── .nix-channels
├── .tmux.conf
└── .vimrc

Diese Baumstruktur wird genau so in das Persönliche Verzeichnis installiert, wenn Sie guix home reconfigure ausführen.

Das Layout 'stow, welches so aufgebaut sein muss, wie GNU Stow es empfiehlt, verfügt über eine zusätzliche Verzeichnisschicht für jede Anwendung, etwa:

~$ tree -a ./dotfiles/
dotfiles/
├── git
│   └── .gitconfig
├── gpg
│   └── .gnupg
│       ├── gpg-agent.conf
│       └── gpg.conf
├── guile
│   └── .guile
├── guix
│   └── .config
│       └── guix
│           └── channels.scm
├── nix
│   ├── .config
│   │   └── nixpkgs
│   │       └── config.nix
│   └── .nix-channels
├── tmux
│   └── .tmux.conf
└── vim
    └── .vimrc

13 directories, 10 files

Eine informelle Spezifikation finden Sie im Handbuch von Stow (siehe deren Einleitung). Die Baumstruktur wird dann nach dem Verfahren von GNU Stow ins Persönliche Verzeichnis installiert, wenn Sie guix home reconfigure ausführen.

Eine passende Konfiguration mit dem 'plain-Layout könnte so aussehen:

(home-environment
  ;; …
  (services
    (service home-dotfiles-service-type
             (home-dotfiles-configuration
               (directories '("./dotfiles"))))))

Erwartungsgemäß würden Sie das Persönliche Verzeichnis dann in diesem Zustand vorfinden:

.
├── .config
│   ├── guix
│   │   └── channels.scm
│   └── nixpkgs
│       └── config.nix
├── .gitconfig
├── .gnupg
│   ├── gpg-agent.conf
│   └── gpg.conf
├── .guile
├── .nix-channels
├── .tmux.conf
└── .vimrc
Variable: home-dotfiles-service-type

Liefert einen Dienst sehr ähnlich wie home-files-service-type (der sogar als Erweiterung für diesen implementiert ist), der aber so gestaltet ist, dass Benutzer, die ihre Dotfiles bisher schon in einem Verzeichnis nachvollziehbar aufbewahren, leicht auf Guix Home überwechseln können. Mit dem Dienst wird Guix Home auf das Dotfiles-Verzeichnis verwiesen, damit die Dateien automatisch ins Persönliche Verzeichnis eingespielt werden, ohne dass Sie alle Dotfiles an die von Guix vorgegebene Konfigurationsweise anpassen müssten.

Datentyp: home-dotfiles-configuration

Verfügbare home-dotfiles-configuration-Felder sind:

source-directory (Vorgabe: (current-source-directory)) (Typ: Zeichenkette)

Der Pfad, bei dem die Auflösung der Dotfiles enthaltenden Verzeichnisse beginnen soll. Vorgegeben ist, dass die Verzeichnisse mit Dotfiles relativ zu der Stelle im Dateisystem, an der home-dotfiles-configuration benutzt wird, als Quellort aufgelöst werden.

layout (Vorgabe: 'plain) (Typ: Symbol)

Welches Layout im angegebenen Verzeichnis vorliegt. Möglich ist entweder 'stow oder 'plain.

directories (Vorgabe: '()) (Typ: Liste-von-Zeichenketten)

Die Liste der Dotfiles enthaltenden Verzeichnisse. Dort wird home-dotfiles-service-type nach den Dotfiles von Anwendungen suchen.

packages (Typ: Vielleicht-Liste-von-Zeichenketten)

Die Namen eines Teils der Verzeichnisse im Paketlayout von GNU Stow. Wenn Sie welche angeben, wird home-dotfiles-service-type nur die Dotfiles aus dieser Teilmenge von Anwendungen einspielen. Dieses Feld wird beim Layout 'plain ignoriert.

excluded (Vorgabe: '(".*~" ".*\\.swp" "\\.git" "\\.gitignore")) (Typ: Liste-von-Zeichenketten)

Die Liste von Mustern, welche Dateien home-dotfiles-service-type auf der Suche nach Dotfiles beim Besuchen jedes in directories aufgeführten Verzeichnisses ausschließen soll.

Variable: home-xdg-configuration-files-service-type

Dieser Dienst ist home-files-service-type sehr ähnlich (und intern erweitert er ihn auch), aber damit werden Dateien definiert, die in ~/.guix-home/files/.config platziert werden, für welche dann eine symbolische Verknüpfung in $XDG_CONFIG_DIR mittels home-symlink-manager-service-type (beispielsweise) angelegt wird, wenn die Persönliche Umgebung aktiviert wird. Er kann erweitert werden um Werte im folgenden Format:

`(("sway/config" ,sway-dateiartig)
  ;; -> ~/.guix-home/files/.config/sway/config
  ;; -> $XDG_CONFIG_DIR/sway/config (mittels symlink-manager)
  ("tmux/tmux.conf" ,(local-file "./tmux.conf")))
Variable: home-activation-service-type

Mit dem Dienst dieses Diensttyps wird ein Guile-Skript erzeugt, das bei jedem Aufruf von guix home reconfigure und jeder anderen Aktion ausgeführt wird. Damit wird die Persönliche Umgebung aktiviert.

Mit dem Dienst dieses Diensttyps wird ein Guile-Skript erzeugt, das bei der Aktivierung der Persönlichen Umgebung ausgeführt wird. Um die symbolischen Verknüpfungen zu verwalten, tut es ein paar Dinge, nämlich:

  1. Der Inhalt jedes files/-Verzeichnisses der aktuellen und der künftigen Persönlichen Umgebung wird eingelesen.
  2. Alle symbolischen Verknüpfungen, die bei der vorherigen Aktivierung durch symlink-manager erzeugt wurden, werden gelöst. Wenn dadurch Unterverzeichnisse leer werden, werden sie gelöscht.
  3. Neue symbolische Verknüpfungen werden auf folgende Weise erzeugt: Es wird jedes files/-Verzeichnis durchsucht (diese werden in der Regel mit home-files-service-type, home-xdg-configuration-files-service-type und vielleicht anderen Diensten definiert) und für die Dateien aus dem Unterverzeichnis files/.config/ werden entsprechende Verknüpfungen in XDG_CONFIG_DIR abgelegt. Zum Beispiel landet eine symbolische Verknüpfung zu files/.config/sway/config in $XDG_CONFIG_DIR/sway/config. Die anderen Dateien in files/ außerhalb des Unterverzeichnisses files/.config/ werden ein wenig anders behandelt: Die symbolischen Verknüpfungen werden dafür in $HOME abgelegt. files/.ein-programm/config landet also in $HOME/.ein-programm/config.
  4. Fehlende Unterverzeichnisse werden erzeugt.
  5. Wenn es schon eine Datei mit so einem Namen gibt, wird von der im Konflikt stehenden Datei eine Sicherungskopie behalten.

symlink-manager ist Teil der essenziellen Persönlichen Dienste und ist somit nach Vorgabeeinstellungen aktiviert und wird benutzt.


Nächste: Shells, Nach oben: Persönliche Dienste   [Inhalt][Index]