Como eu gerencio meus dotfiles com chezmoi

Meu primeiro commit no meu repositório git de dotfiles é de 2018. Já faz mais de 8 anos lidando com esses arquivos e acabei de perceber que estou ficando velho. first-commit

Ao longo desses anos, devo ter usado entre 9 e 10 notebooks diferentes, contando computadores pessoais e de trabalho. Também usei várias formas de sincronizar todos os arquivos: GNU stow; script bash apenas com comandos cp; links com ln; usar os arquivos como um repositório bare. Uma vez também tentei criar branches separadas para pessoal/trabalho, com um script público de instalação, mas não foi nada prático. Sinto que todos esses métodos tinham algo estranho no uso, e às vezes precisavam de trabalho manual ou algum ajuste na hora de configurar um notebook novo.

Agora, usando chezmoi, posso dizer que configurar um ambiente de desenvolvimento em uma máquina nova nunca foi tão fácil.

Felizmente (ou não), eu não entrei na toca do nix para gerenciar os arquivos, porque acho que teria passado horas e horas aprendendo e tentando chegar na configuração perfeita, enquanto ótimas pessoas/desenvolvedores que acompanho aparentemente estão abandonando esse método: https://carlosbecker.com/posts/bye-nix/.

Como o chezmoi funciona

Você pode ler sobre ele em https://www.chezmoi.io/, mas vou tentar explicar um pouco.

Basicamente, chezmoi é um comando que gerencia todos os arquivos para você. Quando você o usa para buscar seus dotfiles, eles são clonados em um diretório específico, e você pode usar todos os comandos do chezmoi. Você pode alterar arquivos, visualizar as mudanças e só então aplicá-las; pode criar templates para ter configurações diferentes para computadores pessoais e de trabalho (como ter um único .gitconfig que funciona com vários emails); pode executar scripts em momentos específicos. E todo esse trabalho de linkar arquivos funciona por padrão quando você usa chezmoi apply.

Ele tem vários subcomandos que facilitam o gerenciamento dos arquivos, como adicionar, editar, testar o apply, etc. Por exemplo, se você quiser entrar no diretório dos seus arquivos, pode usar chezmoi cd; se quiser adicionar/commitar/enviar, pode usar os comandos git junto com o chezmoi, como chezmoi add/commit/push; ou, se quiser entender o que o comando apply fará, pode usar chezmoi apply --verbose --dry-run, além de vários outros comandos.

Vou compartilhar meu caso de uso e a configuração que fiz para talvez você entender melhor.

Meu setup

O uso principal dele é, claro, linkar todos os arquivos, etc., mas podemos fazer muito mais com ele.

Tenho este script .chezmoiscripts/darwin/run_onchange_after_configure-defaults.sh, que configura algumas preferências do macOS. Se você reparar no nome do script, há o prefixo run_onchange. Então, se você pensou que ele roda apenas quando muda (o conteúdo do arquivo), acertou! O after_ também significa que ele será executado somente depois que todos os arquivos, diretórios e symlinks forem atualizados.

Tenho outro script que instala todos os pacotes de que preciso usando brew: .chezmoiscripts/darwin/run_onchange_before_install-packages.sh.tmpl. O before_ significa que ele será executado antes de qualquer arquivo, diretório ou symlink ser atualizado, então não encontro erros de command not found porque o pacote ainda não foi instalado. E ele também é um arquivo .tmpl, o que significa que na verdade é um template para um script bash. Isso porque o conteúdo do script muda com base em uma variável que configurei. Neste caso, muda dependendo se estou em um computador pessoal ou de trabalho, já que não preciso de alguns “pacotes de trabalho” na minha máquina pessoal e talvez vice-versa.

Esse tipo de gerenciabilidade não existia em nenhuma outra ferramenta que usei até agora. Sei que nix provavelmente tem isso, mas tem uma curva de aprendizado que não estou disposto a encarar agora. E é por isso que provavelmente vou continuar com chezmoi: simplicidade também importa.

A configuração inicial

Então, vamos supor que acabei de pegar um computador novo e quero configurar tudo. Abro o terminal e executo o seguinte comando:

chezmoi init --apply $GITHUB_USERNAME

Isso vai clonar o repositório do GitHub, aplicar/linkar todos os arquivos e executar os scripts (se houver). E é isso! Como o chezmoi foi projetado para ser idempotente, se você executar várias vezes, o resultado será o mesmo.

Templates e os detalhes dos arquivos

O chezmoi suporta arquivos normais e arquivos de template. Arquivos normais são linkados normalmente, enquanto templates precisam primeiro receber os valores das variáveis dentro do template, e só então são linkados. Isso significa que você não pode editar diretamente o arquivo gerado pelo template (quer dizer, até pode, mas ele será sobrescrito se você rodar chezmoi apply, já que a mudança não está na fonte da verdade: o template).

Então, para editar um template, você usa o comando chezmoi edit. Por exemplo, como meu .gitconfig muda dependendo se estou usando um computador pessoal ou de trabalho (o email é diferente), eu o uso como template. Assim, rodo chezmoi edit ~/.config/git/config para editá-lo quando quero que uma nova mudança seja persistida.

O arquivo de configuração

Os arquivos de template buscam os valores das variáveis no arquivo principal do chezmoi, que fica no diretório de configuração do chezmoi (~/.config/chezmoi/chezmoi.toml), veja a documentação. Este é o conteúdo do meu arquivo, para referência:

[data]
  email = "[email protected]"
  sshkey = "~/.ssh/id_rsa_yubikey.pub"
  work = false

Mas, no meu caso, esses valores também precisam ser diferentes dependendo se é um computador de trabalho ou pessoal, então também precisamos criar um template para isso. Felizmente, o chezmoi permite ter um template para o arquivo principal de configuração. A localização desse template é dentro do diretório raiz do chezmoi (.chezmoi.toml.tmpl) e há um comando especial para editá-lo: chezmoi edit-config-template. Esse tipo de templating é muito bom e muito útil quando queremos valores diferentes para computadores e arquivos diferentes.

Conclusão

Uso essa ferramenta há meses e não poderia recomendar mais. É simples de aprender, e as operações do dia a dia são sempre as mesmas: editar um template (chezmoi edit) ou adicionar um arquivo (chezmoi add), ir para o diretório (chezmoi cd), aplicar, commitar e enviar. Fácil.


Referências

Enquanto olhava outros usuários do chezmoi, os dotfiles do criador do chezmoi foram úteis para entender o poder dessa ferramenta. Você também pode conferir: twpayne/dotfiles. Também deixo alguns comandos que você provavelmente usará (e que também servem para eu lembrar no futuro):

chezmoi cd
chezmoi edit-config-template
chezmoi add
chezmoi git commit
chezmoi apply --dry-run
chezmoi init
chezmoi data
chezmoi uptade
chezmoi status
chezmoi execute-template