Gerenciando dotfiles e compilações com GNU Stow

Você edita muitos arquivos de configuração (dotfiles)? Também instala programas compilados da fonte por make install e afins? Se sim, o GNU Stow pode ser uma ferramenta interessante para gerenciar esses arquivos e evitar futuras dores de cabeça.

Instalar muitos programas diferentes (i3, bash, vim, git, …) resulta em muitos dotfiles em locais diferentes. O padrão XDG Base Directory Specification indica a pasta ~/.config/. Outros programas podem usar o "estilo Emacs" e salvar suas configurações em uma pasta escondida na pasta pessoal, como ~/.emacs.d/, e outros como o Git podem usar apenas um arquivo na pasta pessoal como em ~/.gitconfig. É muito difícil manter esses arquivos organizados e controlar todos em um repositório Git.

Outro problema com organização de arquivos é quando se compila e se instala um programa pelo código fonte com make install, como por exemplo, quando tal programa não está presente no repositório da distribuição (alternativa: GNU Guix). Como não se costuma distribuir um "make uninstall" (o Make não é um gerenciador de pacotes), para desinstalar um programa instalado desta forma é preciso procurar e excluir manualmente os arquivos instalados.

Estes dois problemas são resolvidos pelo GNU Stow (pacote stow no Debian). Ele é definido como um symlink farm manager. Ou seja, é um gerenciador de symlinks.

Symlinks (symbolic links) são referências para arquivos ou pastas no sistema de arquivos em um outro caminho chamado de target (alvo), fazendo com que tal pasta ou arquivo possam ser encontrados pelo caminho alvo. O Stow se encarrega de criar, excluir e verificar conflitos de symlinks automaticamente.

Gerenciando dotfiles

São quatro passos simples para utilizar o Stow:

  1. Escolher uma pasta (pasta de stow) que guardará os dotfiles.
  2. Dentro da pasta de stow, criar novas pastas (diretórios de pacotes) para cada programa (pacote).
  3. Mover os dotfiles do caminho original para os respectivos diretórios de pacotes.
  4. Executar o stow.

Estes passos serão exemplificados logo abaixo com mais detalhes.

Passo 1: como exemplo será escolhida a pasta ~/.dotfiles/ como pasta de stow.

$ mkdir -p ~/.dotfiles && cd ~/.dotfiles

Passo 2: os três tipos de caminho citados anteriormente podem ser representados pelos programas mpv (~/.config/mpv/), i3 (~/.i3/) e git (~/.gitconfig), respectivamente. Estes serão utilizados como exemplo.

$ mkdir mpv && mkdir i3 && mkdir git # Cria três diretórios de pacotes na pasta de stow

Passo 3: mover os dotfiles de cada programa para as respectivos diretórios de pacotes.

$ mkdir mpv/.config # Para facilitar o comando abaixo
$ mv ~/.config/mpv mpv/.config/ && mv ~/.i3 i3/ && mv ~/.gitconfig git/

O conteúdo dos diretórios de configuração passa a ser chamado de "imagem de instalação", que é a estrutura de arquivos e pastas relativa ao diretório alvo (por padrão uma pasta acima da pasta de stow).

Passo 4: executar o stow em todos os diretórios de pacotes.

$ stow *

É isso! Agora os dotfiles originais contém symlinks das imagens de instalação. Isto permite iniciar um repositório Git na pasta de stow para controlar as alterações, fazer um backup dos dotfiles com apenas uma pasta, juntar os dotfiles mais importantes, etc.

Observação 1: O padrão do Stow é considerar o caminho alvo relativo a uma pasta acima da pasta de stow, portanto o Stow criará symlinks em ../caminho-alvo. Como ~/.dotfiles/ estava na raiz da pasta de usuário, não foi necessário especificar o caminho alvo. Para especificá-lo, passe o parâmetro --target outrapasta na hora de executar o Stow.

Observação 2: Para evitar os arquivos ocultos na pasta de stow pode-se usar o prefixo dot- no nome do arquivo. No caso do Git, o nome do arquivo de configuração seria dot-gitconfig ao invés de .gitconfig. O Stow irá fazer uma pré-processamento para criar um arquivo oculto se for executado com o parâmetro --dotfiles.

Gerenciando instalações

O objetivo original do Stow é gerenciar instalações. Gerenciar os dotfiles é apenas uma consequência interessante da metodologia utilizada.

Para ambos os casos o princípio de funcionamento é o mesmo, apenas a pasta de stow muda para /usr/local/stow/. Para gerenciar uma instalação, ao executar o comando de instalação do programa compilado é passado o parâmetro prefix (há uma exceção para o caso do Emacs). Supondo que o nome do programa compilado seja "nomedoprograma" e que os comandos seguintes são executados a partir da pasta de compilação (% = executa como superusuário):

% mkdir /usr/local/stow/nomedoprograma
% make install prefix=/usr/local/stow/nomedoprograma
$ cd /usr/local/stow
% stow nomedoprograma # Instala o programa
% stow --delete nomedoprograma # Desinstala o programa (remove os symlinks), pode-se remover a pasta em /usr/local/stow/nomedoprograma depois

E esse é o Stow. É um programa bem simples e pequeno mas que pode ser muito útil para evitar poluição do sistema de arquivos e para organizar arquivos espalhados. Costuma ser utilizado para os dois casos de uso citados no início, mas pode servir para qualquer problema envolvendo symlinks.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Post comment