Yusuke Ebihara's website
Dotfiles Blog RSS

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-init-bool

これで、スクリプトの実行時に 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 と連動しています。