コンセプト
新しいマシンでもコマンド一発でいつもの環境を再現したい。理想としてはこんな感じ:
- らくちん - 1コマンドでセットアップ&管理
- ミニマル - .config にすべて収納
- シークレット管理 - SSH 鍵や API キーはパスワードマネージャーで管理、ローカルには置かない
- マシン差分を吸収 - OS (macOS/Linux/WSL/Windows) やコンテキスト (work/personal) に応じた設定
- 再現性 - 必要なツールはすべて宣言的に管理、どこでも同じ環境を構築
- 冪等性 - 何度実行しても既存の設定を壊さない
最も条件を満たすのは Nix かと思いますがガベコレの運用コストが高いので断念。
実装の工夫で冪等性を満たして、宣言的で再現可能にしてみました。
こだわりポイント
- yadm によるシンプルな管理 - なぜyadm?
- シェルも収納 -
/etc/zsh/zshenvで XDG Base Directory 準拠することで .zshrc も .config に収納 - 1Passwordで認証管理 - SSH 鍵、GPG 鍵、API トークンを安全に管理 - op/README.md
- 冪等性 - 冪等なシェルスクリプトのベストプラクティス
- 宣言的なパッケージ管理 - packages.yaml と mise で全プラットフォーム統一管理
- 顔文字プロンプト - いつもは
╰─(*'-') ❯エラーが出たら╰─(*;-;) ❯
環境を素早くセットアップする為によく作るあれです。理想の dotfiles 管理システムは次のようなものです。
- 1 コマンドでセットアップ、管理もシンプル
- マシン差分を吸収
- シークレットは暗号化または 1Password で管理
- XDG Base Directory でホームディレクトリをシンプルに保つ
- 冪等性
思想を大きく 3 種類に分けると
- シンボリックリンクを貼る (GNU Stow like)
- 新しく管理すべきものが増えた時貼るスクリプト書かないといけない
- コピーする (chezmoi)
- Single Source of Truth じゃなくてあんまし直感的じゃない
- ホームディレクトリを git で管理 (Bare Git like)
- 導入時のマージが面倒
- 他と比べて管理が楽
#general
これらを総合的に見たとき導入コストを増やして辛さがスケールしない Bare Git の思想が最も良いと考えてます。
My best tool: yadm
これまで shellscript (GNU Stow like) → Ansible → chezmoi → yadm と使ってきました。
冪等性の担保に惚れて Ansible 使ってたけど、細かいロジックを組めなかったり、欲しい role がなくて結局シェルを書いたり辛さが見えて、技術を扱っている僕らにとって冪等性は常識だから僕らが担保すればいいじゃんね〜と思いました。
chezmoi は上に書いた通り複雑になるのでやめました。あとファイル名を . → dot_ と置換されるのもしっくりこない (消した方がまし) 。
Nix はストレージの使用量がえぐくて定期的にガベコレしないといけないので辛い
yadm は Bare Git の思想の全ての欠点を解決させたツールです。1Password の連携がなかったので自分で書きました。初期導入でマージのシステムがあるともっとうれしい。あと VSCode は git 管理下のワークスペース全体を探索し始めるのでそこには少し注意が必要かも。
ただこれからは AI と対話して環境を整えてもらって chezmoi で管理してもらうみたいな形になるのかな。たとえば「Web 開発用に M2 MacBook をセットアップします。Neovim、fish、Alacritty を使用します。職場用と個人用の SSH キーが必要で、GitHub トークンは 1Password から取得してください。」みたいなプロンプト投げて理想的な環境を整えることができるようになると思う。そうなると dotfiles 自体必要なくなる未来がすぐそこかも〜
Tools
- Shell: zsh + sheldon
- Multiplexer: tmux + TPM
- Editor: Vim + dpp.vim, Neovim + lazy.nvim
- dev env: mise (Node.js, Go, Rust, Ruby, Deno, Bun)
- Python: uv, ruff
- Git: git, delta, gitui, ghq, gibo, git-lfs, gitleaks
- Modern CLI: bat, eza, ripgrep, fd, fzf, gh, starship, zoxide, atuin, mcfly, duf, dust, tokei, sd, bottom, gomi
- AI Assistant: Claude Code, Gemini CLI
macOS Specific:
- Window Manager: yabai + skhd
- Launcher: Raycast