sdf_appunti/gnu_stow.org

4.6 KiB

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:

  $HOME
  +-- .dotfiles
      +   bash                                    (directory - package)
      |   +-- .bash_aliases                       (file)
      +-- vim                                     (directory - package)
      |   +-- .vim                                (directory)
      |   +-- .vimrc                              (file)
      +-- htop                                    (directory - package)
          +-- .config                             (directory)
              +-- htop                            (directory)
                  +-- htoprc                      (file)

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:

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

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