Brewfile + chezmoi + dotfiles:Mac 開發環境的完整備份策略
本篇是「一鍵搞定新 Mac」系列的第 6 / 9 篇。你可以從系列總覽開始閱讀,也可以直接接著看本文。
Brewfile 解決了「裝什麼軟體」,但你的 .zshrc、.gitconfig、SSH key 呢?這篇聊聊怎麼用 Brewfile + chezmoi 把整個開發環境版本控制起來,以及每個工具的職責邊界在哪裡。
問題:你的開發環境有幾層?
一個完整的開發環境其實有三層:
| 層級 | 內容 | 負責工具 |
|---|---|---|
| 軟體安裝 | CLI 工具、桌面 App | Homebrew (Brewfile) |
| 系統設定 | dotfiles、shell config、Git config | chezmoi |
| 編輯器狀態 | Extensions、Settings、Keybindings | VS Code Settings Sync |
很多人(包括以前的我)把所有東西塞在同一個備份機制裡,結果就是職責不清、維護困難。
各工具的職責邊界
Homebrew / Brewfile — 只管「裝什麼」
brew bundle dump --force --no-vscode --file=~/Brewfile
Brewfile 只負責記錄軟體清單,不管設定。加 --no-vscode 是因為 VS Code extensions 有自己的同步機制。
chezmoi — 只管「設定檔」
chezmoi 是一個 dotfiles 管理工具,它不直接在 $HOME 建 symlink,而是用一個獨立的 source directory 管理,透過 chezmoi apply 把設定檔「部署」到正確位置。
3 分鐘快速上手
# 安裝
brew install chezmoi
# 初始化(會建立 ~/.local/share/chezmoi)
chezmoi init
# 把現有 dotfile 加入管理
chezmoi add ~/.zshrc
chezmoi add ~/.gitconfig
chezmoi add ~/.config/starship.toml
# 看看 chezmoi 管了哪些檔案
chezmoi managed
# 編輯某個設定檔
chezmoi edit ~/.zshrc
# 看差異
chezmoi diff
# 套用變更到 $HOME
chezmoi apply
核心觀念:你永遠在 chezmoi 的 source directory 裡編輯,然後 apply 到 $HOME。這樣 source directory 就是一個乾淨的 Git repo,可以推到 GitHub。
VS Code Settings Sync — 只管「編輯器」
登入 GitHub 帳號就自動同步 extensions、settings、keybindings、snippets。不需要任何額外設定。
三者的協作流程
初次設定(在你的主力機器上)
# 1. 產生 Brewfile
brew bundle dump --force --no-vscode --file=~/Brewfile
# 2. 初始化 chezmoi 並加入 dotfiles
chezmoi init
chezmoi add ~/.zshrc
chezmoi add ~/.gitconfig
chezmoi add ~/.config/starship.toml
# ...加入你需要的設定檔
# 3. 把 Brewfile 也交給 chezmoi 管理
cp ~/Brewfile $(chezmoi source-path)/
chezmoi add ~/Brewfile
# 4. 推到 GitHub
cd $(chezmoi source-path)
git remote add origin git@github.com:yourname/dotfiles.git
git add -A && git commit -m "initial dotfiles + Brewfile"
git push -u origin main
# 5. VS Code Settings Sync — 確認已開啟就好
換到新電腦時
# 1. 裝 Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 2. 裝 chezmoi 並從 GitHub 拉下設定
brew install chezmoi
chezmoi init --apply yourname
# 3. 用 Brewfile 安裝所有軟體
brew bundle install --file=$(chezmoi source-path)/Brewfile
# 4. 開 VS Code → 登入 GitHub → Settings Sync 自動還原
四個步驟,整個開發環境就回來了。
chezmoi 的進階功能
chezmoi 不只是 symlink 工具,它還支援:
模板(Templates)— 不同機器用不同設定
# 在 .zshrc.tmpl 裡用條件判斷
{{ if eq .chezmoi.hostname "work-mac" }}
export KUBECONFIG=~/.kube/config-work
{{ else }}
export KUBECONFIG=~/.kube/config-personal
{{ end }}
Secrets 管理 — 敏感資訊不進 Git
# 搭配 1Password CLI 或 macOS Keychain
chezmoi add --template ~/.ssh/config
# 在模板裡引用 Keychain
{{ keyring "ssh-key-passphrase" "my-account" }}
自動化腳本 — 安裝後自動執行
# 建立 run_once_install.sh,chezmoi apply 時自動跑一次
#!/bin/bash
# 設定 macOS 預設值
defaults write com.apple.dock autohide -bool true
defaults write com.apple.finder AppleShowAllFiles -bool true
killall Dock Finder
什麼不該放進 chezmoi
- 大型二進位檔:放 Git LFS 或雲端
- 機密資訊:用 template + keyring,不要明文
- 暫時性設定:
.env.local這種專案層級的不用管 - IDE workspace 設定:VS Code Settings Sync 管就好
反思:為什麼職責分離很重要
以前我用一個巨大的 setup script 做所有事,三百多行的 setup.sh,安裝軟體、複製設定檔、設 macOS defaults,全塞在一起。
問題是:每次只想改一個 .zshrc 設定,都要跑整個 script,還怕改壞其他東西。
拆成三個工具之後,每個工具只管一件事:
- 想加新軟體 → 改 Brewfile,跑
brew bundle - 想改 shell 設定 →
chezmoi edit ~/.zshrc,跑chezmoi apply - 想裝新 VS Code extension → 直接在 VS Code 裝,Settings Sync 自動處理
改動範圍小 = 信心大 = 更敢改。