Nächste: Shells, Nach oben: Persönliche Dienste [Inhalt][Index]
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.
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)
mituse-modules
oder Ähnlichem importiert wird, denn durch den(gnu packages shells)
-Namensraum wird die Definition deszsh
-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.
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.
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.
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.
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
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.
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.
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")))
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:
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.
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]