🏠

既存の dotfiles を chezmoi で管理する

2023/01/05に公開

先日、自分の dotfiles を chezmoi で管理するようにしました。
https://github.com/johnmanjiro13/dotfiles/pull/2

以前までは自前でシェルスクリプトを用意して、dotfiles ディレクトリにある .zshrc などのファイルのシンボリックリンクを作成するということをしていました。
しかし、このやり方はシェルスクリプトの管理が面倒なのと、異なる環境で使う際にシェルスクリプトが正しく動作するかわからないという問題がありました。
そこで、dotfiles を管理するツールである chezmoi に移行してみました。

読み方はシェモアで、フランス語で「私の家」という意味だそうです。

この記事では既存の dotfiles を chezmoi で管理する際に行ったことを書いていきます。

使い方に関しては公式ドキュメントが充実していることと、下記の記事が詳しいので省略します。
https://zenn.dev/ryo_kawamata/articles/introduce-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 で不要なディレクトリやファイルを指定することで、管理対象から外すことができます。

.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 としています。

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]

~/.config/chezmoi/chezmoi.toml
[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 が正常に動作することを保証できます。

.github/workflows/test.yml
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 管理にしたので、自前のシェルスクリプトも今後ここに置いていいかもしれません。
https://github.com/johnmanjiro13/dotfiles

参考URL

脚注
  1. https://www.chezmoi.io/developer/architecture/#run_once_-and-run_onchange_-scripts ↩︎

  2. https://www.chezmoi.io/user-guide/tools/editor/ ↩︎

  3. 筆者の chezmoi を導入する PR に対してもコメントをいただきました。ありがたいです。https://github.com/johnmanjiro13/dotfiles/pull/2#discussion_r1060888399 ↩︎

  4. 参考記事:https://www.mizdra.net/entry/2022/02/22/022109 ↩︎

Discussion