🏠

なぜchezmoiが最強のdotfiles管理ツールなのか?

に公開

はじめに

新しいマシンを手に入れたとき、いつもの開発環境を素早く構築したいと思ったことはありませんか?
また、企業でエンジニアとして働いている方は環境の移行が面倒で新しいマシンへの移行を先送りにしていませんか?

dotfilesとは、.zshrc.gitconfig.config ディレクトリ以下に保存されるファイルなど、ドット(.)から始まる設定ファイルやディレクトリの総称です。これらを管理することをdotfiles管理と呼びます。

この記事では、数あるdotfiles管理ツールの中でも、chezmoiが最強である理由を実体験を交えながら解説します。

dotfiles管理の選択肢

dotfiles管理には大きく分けて2つのアプローチがあります。いずれの場合でもGit/GitHubなどを利用することは前提になっていると思います。

自作の仕組みで管理する

最もシンプルな方法です。
最小構成としては、ファイルをGitリポジトリで管理し、それらのファイルを適切なパスに配置するシェルスクリプトを作成することです。
この構成から独自に機能を追加していくことで、ある程度のdotfiles管理が可能です。
この方法で管理されているdotfilesリポジトリを見ることも多いです。

既存のツールを利用する

既に多くの開発者によって使われ、改良されてきたツールを使う方法です。General-purpose dotfiles utilities - dotfiles.github.ioには、多くのdotfiles管理ツールが紹介されています。

主要なツールとしては、以下のようなものがあります。

Comparison table - chezmoiでは、chezmoiと他のツールの比較がされています。

私のdotfiles管理の変遷

実際に私がどのようにdotfiles管理ツールを使い分けてきたかを振り返ってみます。

2019年8月:シンボリックリンク方式でスタート

https://github.com/smasato/rcm-dotfiles/commit/79567a712654f2570aefe0719e8c471adeffcc7d で、単純なシンボリックリンク方式でdotfilesの管理を始めました。
https://github.com/smasato/rcm-dotfiles/blob/c25e8b57d2339063550ba69d6c1fac94cae9d934/scripts/symlink.zsh のようなシンボリックリンクを張るスクリプトを作成しました。
しばらくはこのシンボリックリンク方式でdotfilesを管理していました。

2021年9月:rcmへの移行

https://github.com/smasato/rcm-dotfiles/commit/dee329256ebbb50defbf6fb103c00860feb17b37 で、rcmへの移行をしました。
移行の理由はあまり覚えていませんが、当時のシンボリックリンクを張るスクリプトでの管理では、多くのファイルを管理するのが大変だったのではないかと思います。

2021年12月:chezmoiへの転換

https://github.com/smasato/dotfiles/commit/9b5f0e0c17e4b3b65b8bbfbf88aa1121b211b2bd で、chezmoiへ移行しました。

大きな移行になるので、新たにリポジトリを作成しました。
https://github.com/smasato/dotfiles で、現在も管理しています。
これまでのdotfilesはリポジトリはrcm-dotfilesにリネームして残しています。

2ヶ月でrcmからchezmoiへの移行したことを見るに、rcmの機能が不足していたのではないかと思います。

現在:3年以上chezmoiを愛用中

2021年12月から現在まで、3年以上にわたってchezmoiを使い続けています。この間、他のツールへの移行を検討したことは一度もありません。それほどchezmoiは完成度が高く、実用的なツールだと感じています。

なぜchezmoiが最強のdotfiles管理ツールなのか?

3年以上chezmoiを使い続けて感じる「最強」の理由を具体的に説明します。

やりたくなることは大体カバーできる

マシンごとの設定を柔軟に管理

会社と個人のMacマシンで微妙に異なる設定が必要な場合でも、chezmoiのテンプレート機能と端末ごとの変数を組み合わせることで、柔軟に管理できます。

{{- if .work }}
# 会社のMac用の設定
{{ else }}
# 個人のMac用の設定
{{ end }}

強力なテンプレートエンジン

Go言語のtext/templateをベースにした強力なテンプレートエンジンを搭載しています。条件分岐、ループ、関数呼び出しなど、プログラミング言語並みの表現力があります。

https://github.com/smasato/dotfiles/blob/ad6f667024a430fd082778e26b2a4758d3fce4ec/.chezmoiscripts/run_onchange_cursor_extensions.sh.tmpl ではCursorの拡張機能をインストールするスクリプトをテンプレート化しています。
Cursorがインストールされている場合は、別途定義した拡張機能をインストールします。

#.chezmoiscripts/run_onchange_cursor_extensions.sh.tmpl

{{ if lookPath "cursor" -}}
echo "Installing Cursor extensions..."

INSTALLED_EXTENSIONS=$(cursor --list-extensions)

{{ range .extensions.cursor.ext_ids -}}
if ! echo "$INSTALLED_EXTENSIONS" | grep -q "^{{ . }}$"; then
  echo "Installing extension: {{ . }}"
  cursor --install-extension "{{ . }}" --force
else
  echo "Extension already installed: ~{{ . }}"
fi
{{ end -}}

https://github.com/smasato/dotfiles/blob/ad6f667024a430fd082778e26b2a4758d3fce4ec/.chezmoidata/extensions.yaml で、Cursorの拡張機能を管理しています。
これを上記のテンプレートから読み込んでいます。

# .chezmoidata/extensions.yaml
extensions:
  cursor:
    ext_ids:
      # Theme & Icon
      - catppuccin.catppuccin-vsc
      - catppuccin.catppuccin-vsc-icons
      - miguelsolorio.fluent-icons
    remote_paths:
      - https://github.com/apple/pkl-vscode/releases/download/0.19.0/pkl-vscode-0.19.0.vsix.chezmoidata/extensions.yaml

パスワードマネージャーとの連携

1Password、Bitwarden、LastPassなど主要なパスワードマネージャーと連携でき、APIトークンやSSH秘密鍵などの機密情報を安全に管理できます。
私は1Passwordを利用しています。

# dot_zshenv.tmpl
# 1Passwordから自動的にトークンを取得(item IDを指定)
export BUNDLE_RUBYGEMS__PKG__GITHUB__COM={{- (onepasswordItemFields "4bji3bh7itygdk4grlid7u7t7y").token.value }}

既存機能の組み合わせで無限の可能性

スクリプト実行機能、外部コマンド呼び出し、テンプレート機能を組み合わせることで、ほぼあらゆる要求に対応できます。実際、3年間使ってきて「chezmoiではできない」と思ったことは一度もありません。

難しいことを考えなくていい

配置先のパスは自動で決まる

chezmoiのソースディレクトリ構造は、実際のホームディレクトリの構造をそのまま反映します。~/.claude/CLAUDE.mdを管理したければ、dot_claude/CLAUDE.mdとして保存するだけです。

~/dotfiles/
├── dot_zshrc
├── dot_gitconfig
└── dot_claude/
    └── CLAUDE.md

パーミッションもファイル名で制御

例えば、実行権限が必要なスクリプトはexecutable_プレフィックスを付けるだけ。プライベートなファイルはprivate_を付ければ、自動的に適切なパーミッションが設定されます。

executable_backup.sh  → chmod +x backup.sh
private_dot_ssh/      → chmod 700 .ssh/

この「規約に従うだけで適切に動作する」設計思想は、余計な設定や手間を省き、dotfiles管理の負担を軽減してくれます。

実際に使ってみる

chezmoiの導入は驚くほど簡単です。

# インストール(macOSの場合)
brew install chezmoi

# 初期化
chezmoi init

# 既存の設定ファイルを追加
chezmoi add ~/.zshrc
chezmoi add ~/.gitconfig

# 変更をコミット
chezmoi cd
git add .
git commit -m "Initial commit"

新しいマシンでの環境構築は、以下のコマンドで開始できます。

# GitHubから直接初期化
chezmoi init smasato

これだけで、全ての設定ファイルが適切な場所に配置されます。

まとめ

dotfiles管理は開発者にとって避けて通れない課題です。私は3年以上chezmoiを使い続けていますが、その間一度も他のツールへの移行を考えたことがありません。

最初にchezmoiの仕組みを理解するのが難しいとは思いますが、一度理解してしまえば、あとは楽にdotfiles管理ができるようになります。

chezmoiを導入する際のポイントは以下があると思います。

  1. まずは小さく始める(.zshrc.gitconfigから始める)
  2. 慣れてきたらテンプレート機能を試してみる
  3. パスワードマネージャー連携で秘匿情報を含むファイルを管理する

私の実際のdotfilesリポジトリsmasato/dotfilesも参考にしてみてください。

この記事で紹介した機能はchezmoiの機能の一部です。chezmoiの機能を全て紹介するのは難しいので、Command overview - chezmoiからchezmoiの機能を確認してみてください。

Discussion