chezmoi
目次
zshrc, .vimrcなどのファイルをgitリポジトリにおいて管理しているが、 今までは自作のシェルスクリプトを置いて管理していた。
dotfilesの管理ツールであるchezmoiを導入することにした。 実際に管理しているdotfilesはebiyuu1121/dotfilesに置いてある。
chezmoiのしくみ
gitリポジトリは ~/.local/share/chezmoi にcloneされ、スクリプトを実行することでこれをホームディレクトリにコピーする仕組みになっている。
インストール
chezmoiのインストールはスクリプトが用意されている。ため、これをcurlで持ってきてshに流せばよい。
sh -c "$(curl -fsLS get.chezmoi.io)"
インストール先は ~/bin となるため、ここにパスを通す必要がある。 .zshrc などに以下の記述をする。
export PATH="$HOME/bin:$PATH"
ちなみに、2台目以降にセットアップする場合は、以下のコマンドでインストールからdotfilesのファイルまで一気に行うことができる。
sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply $GITHUB_USERNAME
ちなみに、homebrewなどのパッケージマネージャーでインストールすることもできるが、 以上のワンライナーセットアップが便利なのでこちらを採用した。
ちなみに、上のワンライナーも覚えることができないので、自分のgithubリポジトリにインストールスクリプトを配置しているため、 以下のコマンドで展開まで実行することができる。
curl -sSL dot.ebiyuu.com | bash
準備
自分の場合はすでにdotfilesリポジトリがgithubにあったため、以下のコマンドを実行した。
chezmoi init $GITHUB_USERNAME
chezmoi cd # ~/.local/share/chezmoi に移動
今までは手書きのシェルスクリプトで管理していたため、ファイル名は適当だった。
chezmoiではディレクトリ内にあるファイルは全てホームディレクトリに同期されてしまうため、
ファイルを正しい名前にリネームしておく。
(ただし、. で始まるファイルは dot_ にする。 ~/.vimrc → ~/.local/share/chezmoi/dot_voimrc )
これで、
chezmoi apply
を実行するとホームディレクトリに配置される。
設定
特に設定をしなくても便利に使うことができるが、 auto commitだけ設定している。
以下の設定を ~/.config/chezomoi/chezmoi.toml に記入する。
[git]
autoCommit = true
autoPush = true
ただし、こうなってくると chezmoi.toml もchezmoiで管理したくなる。
chezmoi自体の設定ファイルは特殊な方法で管理する。
~/.local/share/chezmoi/.chezmoi.toml.tmpl に配置し、 chezmoi apply を実行する。
これで、 chezmoi edit を実行すると自動的にcommit/pushが行われるため、反映を忘れることがなくなる。
コミットログを綺麗に保ちたいなどの要求がなければ設定しておいてよさそう。
普段の運用
chezmoiでホームディレクトリに配置されるのはシンボリックリンクではなく実ファイルであるため、
ホームディレクトリの .zshrc を編集してもgitリポジトリには反映されない。
以下のコマンドを用いることで、元ファイルをエディタで編集→反映→コミット(auto commitが有効の場合のみ) を実行できる。
chezmoi edit ~/.zshrc
また、直接 ~/.zshrc などを編集した場合、以下のコマンドで逆に反映することができる。
chezmoi add ~/.zshrc
以下のコマンドでまとめて反映できる。
chezmoi re-add
一般的には編集して動作確認してからコミットすることが多いと思うので、
編集→動作確認→ chezmoi re-add の手順を踏むことが多い。
テンプレートなどを使う場合はこの運用はできない気がする。テンプレート機能を使い始めたら考える。
afxのインストール
chezmoi apply を実行した際に、 b4b4r07/afx: 📦 Package manager for CLI をインストールするようにする。
"afx" はcli管理ツールで、現在はneovimをビルドする設定を入れているだけだが、いろいろ設定することができる。
これはchezmoiのスクリプト機能によって実現することが可能である。
~/.local/share/chezomi 以下に追加した、特定の文字列で初まるシェルを、 chezmoi apply のタイミングで実行してくれる。
以下の2ファイルを追加する。
run_once_install_afx.sh : 一回だけ実行
#!/bin/bash
set -eu
echo "Installing afx..."
curl -sSL https://raw.githubusercontent.com/b4b4r07/afx/HEAD/hack/install | bash
run_after_afx.sh : chezmoi apply するたびに、「dotfilesの配置が終わったタイミングで」実行
#!/bin/bash
set -eu
echo "Installing with afx..."
afx install
afx update
afx uninstall
これで、dotfilesの配置と同様にソフトのインストールもできるようになった。
prompt の活用
ただ、サーバー等、「dotfilesを配置したいけどneovimなどインストールするまでではない」ということもある。
そこで、 promptBoolOnceを活用し、chezmoi init した際に選択できるようにした。
.chezmoi.toml.tmpl を書きかえる。
[git]
autoCommit = true
autoPush = true
+[scriptEnv]
+ {{ if promptBoolOnce . "fullInstall" "Do you want to perform full install?" }}CHEZMOI_FULL_INSTALL = "1"{{ end }}
これで chezmoi init を実行するとプロンプトが表示され、回答が ~/.config/chezmoi/chezmoi.toml に記入される。

これで、スクリプトの実行時に CHEZMOI_FULL_INSTALL がセットされるようになるので、run_once_install_afx.sh run_after_afx.sh を書き換える。
#!/bin/bash
set -eu
+if [[ ! -z "${CHEZMOI_FULL_INSTALL:-}" ]]; then
echo "Installing afx..."
curl -sSL https://raw.githubusercontent.com/b4b4r07/afx/HEAD/hack/install | bash
+fi
#!/bin/bash
set -eu
+if [[ ! -z "${CHEZMOI_FULL_INSTALL:-}" ]]; then
echo "Installing with afx..."
afx install
afx update
afx uninstall
+fi
References
コメント
Github Issue と連動しています。