sdf_appunti/gnu_stow.org

119 lines
4.6 KiB
Org Mode

* Gestire i dotfiles con GNU Stow
GNU Stow è uno strumento nato per gestire in modo massivo
i link simbolici nell'installazione di pacchetti software
compilati dai sorgenti.
La sua specializzazione è gestire i link simbolici e per
questo è perfettamente adatto allo scopo di gestire i
dotfiles in un repository git, files che poi saranno
agganciati come link simbolici nelle directory standard.
* I "package"
Stow definisce come package delle collezioni di elementi
correlati allo stesso contesto e che si vogliono gestire
come elemento unitario. Un package è una directory che
contiene al suo interno tutta la struttura che si vuole
replicare.
Il package "vim" (quindi la directory "vim") conterrà tutti
i files e le directory necessari per la configurazione di
vim. Il nome del package non è necessariamente lo stesso
del programma di cui andremo a gestire i dotfiles, ma è
sicuramente buona pratica dare dei nomi significativi.
* La "stow directory"
E' la directory che contiene i package che vogliamo
gestire.
Se non indicato in modo esplicito Stow considera come
stow directory la directory corrente.
* La "target directory"
E' la directory di destinazione dove Stow andrà a creare
i link simbolici. Se non indicata in modo esplicito
Stow assume come target directory la parent della
directory corrente.
* Creazione della struttura.
Assumendo che la stow directory si chiami ".dotfile"
un esempio di struttura potrebbe essere questo:
#+begin_example
$HOME
+-- .dotfiles
+ bash (directory - package)
| +-- .bash_aliases (file)
+-- vim (directory - package)
| +-- .vim (directory)
| +-- .vimrc (file)
+-- htop (directory - package)
+-- .config (directory)
+-- htop (directory)
+-- htoprc (file)
#+end_example
* Esecuzione ~stow bash~ crea i limk simbolici del package "bash". Mantenendo le impostazioni
predefinite e assumendo di aver eseguito il comando posizionati nella directory
$HOME/.dotfiles Stow creerà un link simbolico di nome ".bash_alias" nella $HOME
che andrà a puntare a ~$HOME/.dotfiles/bash/.bash_alias~
E' possibile indicare più package: ~stow bash htop~ creerà i link simbolici per
i package "bash" e "htop".
E' possibile anche far girare stow per tutti i package della stow directory: ~stow *~
* ~--adopt~
Un parametro estremamente utile, ma da usare con cautela è ~--adopt~.
Una volta creata la struttura dei package dove i files possono essere vuoti, si
può utilizzare questa opzione per automatizzare lo spostamento del file effettivo
nella sua posizione del package e la creazione del link simbolico.
Quindi, assumendo di aver creato la struttura e che nel package "bash" il file ~bash_aliases~ sia presente ma vuoto e assumendo anche che esista il file ~$HOME/.bash_aliases~, l'uso del comando ~stow --adopt bash~ andrà a spostare
il file ~$HOME/.bash_aliases~ nella ~$HOME/.dotfiles/bash~ sovrascrivendo
il file esistente e creerà un link simbolico che vi punta.
a spostare
* Rimozione dei link simbolici
Può capitare di voler far pulizia: è possibile rimuovere i link simbolici
creati usando il parametro ~-D~
* Configurazioni separate per macchine separate
E' un funzionalità non gestita direttamente da Stow.
Tuttavia, con un po' di manualità si possono creare package specifici sfruttando
il fatto che Stow non funziona con dei "sotto-package" e utilizzando in modo
corretto i parametri ~-d~ e ~-t~
E' possibile creare una struttura simile a questa:
#+begin_example
$HOME
+-- .dotfiles
+-- bash (directory - package)
+-- PC1 (directory - macchina 1)
| +-- .bash_aliases (file per macchina 1)
+-- PC2 (directory - macchina 2)
+-- .bash_aliases (file per macchina 2)
#+end_example
A questo punto si dovrà indicare a Stow che, per la macchina 1, la stow directory
è la ~$HOME/.dotfiles/bash~ e che la target directory è la ~$HOME~.
Il comando sarà quindi qualcosa di simile (usando il parametro ~-n~ per simulare
l'esecuzione: ~stow -n -d $HOME/.dotfiles/bash -t $HOME PC1~