Development

Evoluindo Meus Dotfiles: Do Simples ao Modular

Escale de craft pessoal para colaboração em equipe—construindo dotfiles modulares e baseados em tópicos com suporte shell-neutro, bootstrapping inteligente e ambientes reproduzíveis através de Mackup e Brewfile

Dois Anos Depois: Por Que Revisei Tudo

Quando publiquei meus dotfiles em 2013, o objetivo era simples: parar de esquecer como configurar meu ambiente. E funcionou. Ter .aliases, .exports, .functions e um .zshrc versionados economizou tempo toda vez que reinstalei o sistema.

Mas dois anos depois, depois de trocar de máquina algumas vezes, ajudar colegas a se ambientar e cansar de manter aquele setup flat cheio de gambiarras, percebi que precisava refatorar. Era difícil de reaproveitar, difícil de explicar e mais difícil ainda de compartilhar.

Então decidi adotar uma estrutura modular baseada em tópicos. Inspirado no modelo do Zach Holman, essa reescrita não foi só estética — mudou minha forma de pensar sobre ferramentas, portabilidade e colaboração.

Esse post mostra o que mudou, o que ficou e o que aprendi no processo.

Simples Demais Dá Trabalho

O setup de 2013 era plano, assim:

~/.dotfiles/
├── .aliases
├── .exports
├── .functions
├── .zshrc
└── install.sh

Funcionava porque só eu usava. Mas com o tempo, começaram os problemas:

  • Muitos assuntos misturados nos mesmos arquivos
  • Sem separação clara entre bash e zsh
  • Difícil reaproveitar partes no onboarding ou em servidores

Agora o setup está assim:

~/.dotfiles/
├── bash/
├── git/
├── macos/
├── zsh/
└── install.sh
PastaPropósito
bash/Configurações do shell Bash
zsh/Aliases, completions, plugins
git/.gitconfig, regras de ignore
macos/Ajustes específicos do macOS

Cada uma tem arquivos *.symlink e lógica de instalação por sistema. Ficou muito mais fácil compartilhar e escalar.

Bootstrap Mais Inteligente com install.sh

O novo install.sh faz mais do que apenas ln -s. Ele detecta dependências, instala só o necessário e separa bem o que é de cada shell.

find * -name "*.symlink" | while read file; do
  ln -sf "$file" "$HOME/.$(basename "$file" ".symlink")"
done

Simples, mas eficiente. Não preciso mais me preocupar com sobrescrever arquivos ou caminhos fixos. Tudo vive em dotfiles/ e é puxado sob demanda.

FuncionalidadeBenefício
*.symlinkInstalação declarativa e segura
Layout modularReutilizável e didático
Shell-awareSuporte para Zsh e Bash

Onboarding agora leva minutos, não horas.

Compatível com Vários Shells e Mais Limpo

Em 2013, tudo era Zsh. Agora também incluo suporte a Bash. Os arquivos .bash_profile, .bashrc e .zshrc coexistem, e a lógica comum (como variáveis de ambiente) vive em arquivos reutilizáveis.

Exemplo:

# exports.sh
export EDITOR=nvim
export PATH="$HOME/bin:$PATH"

Sendo usado assim:

source "$DOTFILES/exports.sh"

Além disso, reorganizei os aliases e funções por intenção:

ArquivoDescrição
aliases.zshAtalhos como gst para git status
functions.zshLógicas como extract() para .zip/tar
path.zshOrganização das entradas do PATH

O prompt virou algo opcional e separado — só mexo quando preciso.

Ferramentas de Apoio: Mackup e Brewfile

Além dos dotfiles, adicionei ferramentas para manter a consistência do sistema. Duas se destacam:

  • Mackup: faz backup das preferências de apps como Terminal, iTerm2, Sublime, etc. Funciona muito bem após uma instalação limpa.
  • Brewfile: lista pacotes CLI e apps GUI. Com um comando, instalo tudo via Homebrew:
brew bundle --file=~/dotfiles/Brewfile

Exemplo do meu Brewfile:

brew 'git'
brew 'nvim'
cask 'iterm2'

Não é só conveniência. Isso garante reprodutibilidade.

FerramentaFunção
MackupBackup/restauração de configurações de apps
BrewfileInstalação de CLI e apps de forma scriptada

Hoje, levo 30 minutos do zero até um setup funcional.

O Que Vem Agora

Esse setup está mais perto do que imaginei em 2013. Modular, portável, compartilhável e sem depender da minha memória para funcionar.

Ainda há o que evoluir:

  • Suporte para Linux
  • Testes e validação no install.sh
  • Criar script de onboarding para novos devs

Mas estou satisfeito. Não é só sobre meu terminal. É sobre dar vantagem para quem começa comigo e espalhar boas práticas que escalam.

Veja a evolução no GitHub