Managing dotfiles with dotbot
We have an amazing development tool at Shopify called spin. Spin lets you create brand new cloud-based development environments in just a few seconds, right from your CLI. These environments are meant to be somewhat short-lived; I often spin one up just for the day to work on a PR, and then destroy it after my PR is merged.
As a longtime vim and linux user, I want to make sure that all my configuration files (aka "dotfiles") are made available automatically on any new environments that I'm setting up.
There are many different ways of managing your dotfiles. I started my
journey with a "simple" shell script that tried to set up .vimrc
,
.zshrc
, etc. Inevitably this script became overly complex, and was too
cumbersome to maintain.
I briefly toyed around with ansible for managing my local system, but I found it to be overkill just managing dotfiles on remote systems.
Finally I discovered dotbot, which has a few features that I like:
- No dependencies
- Add into your dotfiles repo via a git submodule
- Supports most of the stuff I need, without being too complicated
- Configuration is easy to read & write
- Safe to re-run
In particular, to set up neovim, I have something like this in my dotbot configuration:
# install.conf.yaml --- - defaults: link: relink: true force: true - link: # This line symlinks the astronvim repo from the dotfiles checkout # into ~/.config/nvim ~/.config/nvim: vim/astronvim # Link in our user configuration for astronvim ~/.config/nvim/lua/user/init.lua: path: vim/user_init.lua - shell: # Install all neovim plugins with packer - nvim --headless -c 'autocmd User PackerComplete quitall' -c PackerSync
Since setting up my dotfiles with dotbot, I've discovered that I'm much
more willing to experiment with different configurations and tools. It's
easy to blow away local directories, or git restore
in my dotfiles repo,
and then re-run the install script.
One small tweak I made to the generic install script is to split up
configurations by operating system and environment. I have different
configurations for
Linux,
macOS, and
spin. I
also have the install
script send
logs to the home directory, which makes it easier to debug when something
has gone wrong. Adding exec &> >(tee -a $HOME/.dotfile-install.log)
at
the top of the install script copies the script output to a log file in my
home directory, as well as outputting to stdout/stderr.
My dotfiles can be found on github.
Comments