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.

It is often the case that Guix Home users already have a setup for versioning their user configuration files (also known as dot files) in a single directory, and some way of automatically deploy changes to their user home.

The home-dotfiles-service-type from (gnu home services dotfiles) is designed to ease the way into using Guix Home for this kind of users, allowing them to point the service to their dotfiles directory, which must follow the layout suggested by GNU Stow, and have their dotfiles automatically deployed to their user home, without migrating them to Guix native configurations.

The dotfiles directory layout is expected to be structured as follows. Please keep in mind that it is advisable to keep your dotfiles directories under version control, for example in the same repository where you’d track your Guix Home configuration.

~$ 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

For an informal specification please refer to the Stow manual (siehe Introduction). A suitable configuration would then be:

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

The expected home directory state would then be:

.
├── .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

Return a service which is very similiar to home-files-service-type (and actually extends it), but designed to ease the way into using Guix Home for users that already track their dotfiles under some kind of version control. This service allows users to point Guix Home to their dotfiles directory and have their files automatically deployed to their home directory just like Stow would, without migrating all of their dotfiles to Guix native configurations.

Data Type: home-dotfiles-configuration

Available home-dotfiles-configuration fields are:

source-directory (default: (current-source-directory))

The path where dotfile directories are resolved. By default dotfile directories are resolved relative the source location where home-dotfiles-configuration appears.

directories (type: list-of-strings)

The list of dotfiles directories where home-dotfiles-service-type will look for application dotfiles.

exclude (default: '(".*~" ".*\\.swp" "\\.git" "\\.gitignore"))

The list of file patterns home-dotfiles-service-type will exclude while visiting each one of the directories.

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]