既存の dotfiles を chezmoi で管理する
先日、自分の dotfiles を chezmoi で管理するようにしました。
以前までは自前でシェルスクリプトを用意して、dotfiles ディレクトリにある .zshrc などのファイルのシンボリックリンクを作成するということをしていました。
しかし、このやり方はシェルスクリプトの管理が面倒なのと、異なる環境で使う際にシェルスクリプトが正しく動作するかわからないという問題がありました。
そこで、dotfiles を管理するツールである chezmoi に移行してみました。
読み方はシェモアで、フランス語で「私の家」という意味だそうです。
この記事では既存の dotfiles を chezmoi で管理する際に行ったことを書いていきます。
使い方に関しては公式ドキュメントが充実していることと、下記の記事が詳しいので省略します。
既存のリポジトリを chezmoi で管理する
既存のリポジトリで初期化する
chezmoi のプロジェクトを初期化する際には chezmoi init
を実行しますが、そのままだと新しくリポジトリが作成されてしまいます。
今回はすでに存在しているので、次のコマンドを使ってリポジトリを clone してきます。
$ chezmoi init git@github.com:johnmanjiro13/dotfiles.git
これで、~/.local/share/chezmoi
にリポジトリが clone されます。
また、GitHub を利用していてリポジトリ名が dotfiles
の場合は GitHub のアカウント名だけでも clone できます。
デフォルトでは https になりますが、--ssh
オプションを使うことで SSH での clone も可能です。ほかにも利用法はありますが、詳細はドキュメント をご参照ください。
$ chezmoi init johnmanjiro13
シンボリックリンクを chezmoi の管理下におく
既存のリポジトリでは各ファイルのシンボリックリンクを作成して管理していました。
chezmoi で設定ファイルを管理するためには通常 chezmoi add
を利用しますが、これはシンボリックリンクに対してはうまく機能しません。
この場合は --follow
オプションをつけることで、もとのファイルまで辿って chezmoi のファイルを作成することができます。
$ chezmoi add --follow ~/.zshrc
この状態で chezmoi apply
を実行すると、もとのシンボリックリンクを chezmoi が作成するファイルで置き換えることができます。
不要なファイルを管理外に指定する
chezmoi はデフォルトではディレクトリに存在するファイルを全て管理しようとします。
しかし、今回のリポジトリには iTerm2 の profile.json を含んでおり、これは chezmoi で管理する必要がありません。
この場合は、.chezmoiignore
で不要なディレクトリやファイルを指定することで、管理対象から外すことができます。
# ディレクトリを除外
iterm/
# ファイルを除外
README.md
シェルスクリプトを管理する
既存の dotfiles では一部 tmux で利用しているシェルスクリプトがあり、以前は /usr/loca/bin
にシンボリックリンクを配置していました。
しかし、chezmoi ではホームディレクトリ外のファイルを管理することはできません。
そこで、今回はパスが通っている ~/.local/bin
にファイルを置き直すことで対処しました。
一度しか実行しないスクリプトを作成する
既存の dotfiles では初回のみ Rust のインストールや brew install
を実行するようなシェルスクリプトになっていました。
chezmoi で同様のことを行うには、run_once_
から始まるファイル名のスクリプトを作成します[1]。
run_once_
スクリプトは chezmoi が管理している scriptState
に含まれるハッシュがない場合にのみ実行されます。
brew install
を実行するのは macOS の場合のみなので、今回はテンプレート機能を使って次のようなスクリプトを作成しました。
ファイル名は run_once_install-packages.sh.tmpl
としています。
#!/bin/bash
# rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install cargo-edit
rustup component add clippy
{{ if eq .chezmoi.os "darwin" }}
read -r -d '' PACKAGES <<EOF
anyenv
ghq
jq
EOF
for package in `echo $PACKAGES`; do
brew install $package
done
{{ end }}
chezmoi の設定ファイルを chezmoi で管理する
chezmoi で .zshrc などを編集する際には chezmoi edit
を使います。このコマンドで使うエディタを変更したい場合、$EDITOR
を設定することでも実現できますが、これだとグローバルな設定になってしまうので、chezmoi 用の設定ファイルを作成します。
筆者は VSCode を利用しているので、~/.config/chezmoi/chezmoi.toml
を作成しVSCode を起動するようにしました[2]。
[edit]
command = "code"
args = ["--wait"]
通常のファイルであれば chezmoi add
で管理下に置くことができますが、chezmoi 自信の設定ファイルの場合にはテンプレートを作成して管理する必要があります。
筆者は最初、chezmoi add ~/.config/chezmoi/chezmoi.toml
を実行して管理しようとしていたのですが、chezmoi doctor
コマンドを実行したところ、chezmoi.toml
に対して suspicious-entries
と警告が出ていました。
issue で報告したところ、.chezmoi.toml.tmpl
を作成するよう教えていただきました[3]。ちゃんとドキュメントを読まなきゃだめですね。
同じ内容を chezmoi プロジェクト内の .chezmoi.toml.tmpl
に記述して chezmoi apply
したところ、chezmoi doctor
での警告が出なくなりました。
テスト
chezmoi はインストールも簡単なので GitHub Actions を使って正常に chezmoi apply
が実行できるかテストすることにしました[4]。
これで新しい環境で chezmoi apply
が正常に動作することを保証できます。
name: test
on:
- push
jobs:
test:
name: test
runs-on: macos-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- name: Install dotfiles
run: sh -c "$(curl -fsLS chezmoi.io/get)" -- init --apply -S .
終わりに
以上、筆者が既存の dotfiles を chezmoi で管理する際に行ったことでした。
実際に仕事用の PC と個人の PC どちらでも動作することが確認できており、自前のシェルスクリプトの管理から解放されたのが清々しいです。
最後に筆者の dotfiles です。~/.local/bin
も一部 chezmoi 管理にしたので、自前のシェルスクリプトも今後ここに置いていいかもしれません。
参考URL
- https://www.chezmoi.io/
- chezmoi で dotfiles を手軽に柔軟にセキュアに管理する
- chezmoi を使って VSCode devcontainer 対応 dotfiles を作る
-
https://www.chezmoi.io/developer/architecture/#run_once_-and-run_onchange_-scripts ↩︎
-
筆者の chezmoi を導入する PR に対してもコメントをいただきました。ありがたいです。https://github.com/johnmanjiro13/dotfiles/pull/2#discussion_r1060888399 ↩︎
Discussion