こちらで導入していたrcmからchezmoiに移行しました。
chezmoiにした決め手
インストール
mac
$ brew install chezmoi
ubuntu
$ sudo snap install chezmoi --classic
コマンド
# 管理対象の一覧 $ chezmoi managed # 既存のファイルをchezmoi管理にする $ chezmoi add ~/.zshrc # 既存のファイルをテンプレートとして追加する $ chezmoi add --template ~/.zshrc # すでに管理下に置かれているファイルをテンプレートとして扱うよう変更する $ chezmoi chattr +template ~/.zshrc # 編集 $ chezmoi edit ~/.zshrc # 適用(ドライラン) $ chezmoi apply --dry-run --verbose # 適用 $ chezmoi apply # ファイル指定で適用 $ chezmoi apply ~/.zshrc # リポジトリに移動 $ chezmoi cd # templateで使える変数の確認 $ chezmoi data # gitリポジトリの(他マシンでの)変更を取り込む $ chezmoi update # templateのテスト $ cat foo.tmpl | chezmoi execute-template # templateのテスト2 $ chezmoi cat ~/foo.yml
apply
chezmoiはdotfileを直接編集するのではなく、元ファイルを編集し、それを反映するスタイルです。
編集するファイルは、 ~/.local/share/chezmoi
にあります。
編集したものを反映するためのコマンドがapplyです。
add
chezmoiの管理対象にファイルを追加したい時に使います。
cd
chezmoiは管理対象のファイルを ~/.local/share/chezmoi
に集めてそこをgit管理します。
chezmoi git
というサブコマンドがあるので、移動しなくてもgit管理はできますが、直接git操作したい時に対象ディレクトリに移動します。
execute-template
私した文字列をtemplateとして実行した結果を表示します。
$ chezmoi execute-template '{{ .chezmoi.hostname }}'
と実行するとhostnameが表示されます。
templateのデバッグをする際に必須です。
rcmからの移行
初期化
chezmoi で dotfile を管理するためのディレクトリを作成します。
以下コマンドで ~/.local/share/chezmoi
にディレクトリが作られます。ここが実体になります。自動的にgit initも行われます。
$ chezmoi init
私はrcmで管理していたリポジトリがあるのでリモートリポジトリの設定をしました。
$ git remote add origin git@github.com:kkkw/dotfiles.git
管理ファイルの追加
初期化したら管理したいファイルを追加していきます。
rcmは ~/dotfiles
に実体を持って、各ファイルはシンボリックリンクです。
chezmoiにシンボリックリンクを追加する場合は add
で --follow
オプションを使います。
下記を実行すると、~/.local/share/chezmoi
にdot_zshrcというファイルが作成されます。
$ chezmoi add --follow ~/.zshrc
管理ファイルの編集
chezmoi edit ~/.zshrc
でファイルを編集することができますが、 ~/.local/share/chezmoi
を直接編集しても大丈夫です。
また、管理ファイルとして追加した後にtemplate機能を使いたい時は以下のコマンドでtemplate化します。
template化すると、dot_zshrcがdot_zshrc.tmplになります。
$ chezmoi chattr +template ~/.zshrc
template化した後は、 chezmoi data
, chezmoi execute-template
, chezmoi apply --dry-run ~/.zshrc
を使ってデバッグしていきます。
bitwardenを使いたい場合
bitwarden-cliのインストール
$ brew install bitwarden-cli
$ sudo snap install bw
templateの書き方
前提として、対象ファイルはtemplate化されている必要があります。 例えば、bitwardenにAPI_TOKENというアイテムが登録されていたとして、そのnotesにある値を使いたい場合は下記のようにします。
export API_TOKEN={{ (bitwarden "item" "API_TOKEN").notes | trim }}
bitwardenのカスタムフィールドを使っている場合は、別の関数を使います。 下記の場合はtokenという名前のカスタムフィールドの値を持ってきてます。
{{ (bitwardenFields "item" "API_TOKEN").token.value | trim }}
環境変数の設定
applyやexecute-templateをする前に下記でBW_SESSIONを設定しておきます。 ただし、私が実行したところ下記を設定していてもmacではマスターパスワードを毎回聞かれました。
$ export BW_SESSION=$(bw {login,unlock} --raw)
適応
管理対象にしたいファイルを全て追加した後にapplyします。
applyを実行した時にすでにシンボリックリンクがあるので、上書きの確認が出るので all-overwrite
します。
別PCへの反映
別PCへ反映したい場合は、そちらでもchezmoiをインストールして、初期化、適応すれば終わりです。 下記コマンドで初期化、適応できます。
$ chezmoi init --apply git@github.com:kkkw/dotfiles.git
リポジトリがgithubにあり、リポジトリ名が、dotfilesである場合は、ユーザー名の指定だけでinitできます。
--ssh
オプションをつけないと、リモートリポジトリがhttpsで設定されます。
$ chezmoi init --apply --ssh kkkw
ちょっと分かりづらかったこと
マシンによって作りたくないファイル
macでは不要だけどubuntuでは欲しいファイル(.ubuntu-rc)というのがあったとしてそれをどう表現するのかがわかりませんでした。
結果としては、 .chezmoiignore
というファイルを作ってその中で条件分岐で管理します。
ignoreファイルなので、不要な環境の時にそのファイル名が表示されるように管理します。
上記の例では、macでは.ubuntu-rcを作りたくない、ubuntuでは.ubuntu-rcを作りたい。
dot_ubuntu-rcとして元ファイルは作っておきます。
その上で、 .chezmoiignore
に下記のように記載します。
{{ if eq .chezmoi.os "darwin" }} .ubuntu-rc {{- end }}