Chezmoiでかんたんクロスプラットフォームdotfiles管理のススメ

はじめましての人ははじめまして。そうでないひとはお久しぶりです。株式会社はてなのエンジニアの猫ロキP(@deflis/id:deflis55)です。

これははてなエンジニアアドベントカレンダー2022 43日目の記事です。 昨日は同じチームでお世話になっている id:anatofuz2022年、CPAN(Perlの)モジュールのメンテナを引き継ぐ活動を始めた件 - Acme::AnaTofuZ->new; でした。

ホントは去年の秋ぐらいに書こうと思っていたネタです。書く暇がなくて伸ばし伸ばしになっていたので、アドベントカレンダーに乗じて書くことにしました。 はてなに転職してはや4ヶ月。去年、 chezmoi を導入して個人PCから会社PCまで同じ設定ファイルを使える環境を構築したので、そのやり方を紹介します。

はじめに

みなさんdotfilesは書いてますよね?*1*2 そのdotfilesの配置や管理の方法はシンボリックリンクやAnsible、Makefileなどいろいろありますが、その管理専用のプロダクトが存在します。それがchezmoiです。

www.chezmoi.io

chezmoiを使うとコマンド一発でインストールからdotfilesの導入ができ便利です。

ですが、導入にあたって日本語の解説が少ないなと思ったので今回書くことにしました。

導入のメリット

www.chezmoi.io

1. シングルバイナリでクロスプラットホームである

chezmoiはgolang製のプロダクトなのでシングルバイナリです。また、macOSLinuxだけでなく、Windowsにも対応していてscoopなどでもインストールできます。

自分は oh-my-posh でクロスプラットホームなプロンプトを実現しています。Starship も最近はクロスプラットホームで人気なようなので、そちらもおすすめです。

theme.png

2. テンプレート機能で分岐できる

Templating - chezmoi

テンプレート機能があり、環境ごとに色々出し分けができます。 例えば、これによって特定の環境でだけ動かしたいzshrcの項目をそもそもスキップすることができ、シェルの起動時間を短くすることができます。例えばhomebrewをmacだけで読み込みたい、みたいなことができます。

公式による活用事例としてWSLを判定するもあって、WSLでssh-agentを活用したいときに便利です。*3

秘密事項もテンプレート連携で色々できるので調べてみるといいでしょう。*4

3. ワンタイムスクリプトを流せる

Architecture - chezmoi

これも地味に便利な機能です。 環境構築するときっていつもhomebrewで色々インストールしたりとかみんなすると思うんですけど、それを自動化することができます。

小ネタなんですが、Windowsでも使うつもりがあるなら拡張子cmd/ps1になるようにしておかないと、Windowsで実行できなくて詰みます。*5 逆にWindowsでのみ実行するスクリプトも空にするなどの対策が必要になります。*6 クロスプラットフォームできるけどこのへんは融通が効かないので対策が必要になるようです。*7

終わりに

dotfilesをメンテナンスし易い状態にすると、転職時の環境構築だけでなくPCの突然の故障*8やモバイルPCのLinuxへの切り替え*9などのさまざまな環境の変化に柔軟に対応することができます。 皆さんもメンテナンスしやすいdotfilesを書いていきましょう。

今回のおすすめ作品

これ書いてたらまだアニメ見れてないんですけど、これから見ます。

tsunlise-pr.com

*1:書いてない人は、 漢のzsh などを参考に構築しましょう。

*2:deflis/dotfilesで書いてます。

*3:いろんな方法がありますが、混沌を極めるWindowsのssh-agent事情 - Qiitaとかが参考になるかと思います。

*4:chezmoi で dotfiles を手軽に柔軟にセキュアに管理する (zenn.dev)とかが参考になると思います

*5:Linuxのみ対応のスクリプト例: dotfiles/run_once_install_linux.sh.cmd.tmpl at main · deflis/dotfiles (github.com)

*6:Windowsのみ対応のスクリプト例: dotfiles/run_onchange_before_install.ps1.tmpl at main · deflis/dotfiles (github.com)

*7:あとnushellみたいなクロスプラットフォームなshellを使う手もありますが、それでもハマりどころはあるので難しい

*8:昨年10月に突然SSDが故障してしまったことがありました。

*9:突撃! 隣のLinuxデスクトップのうち、ThinkPadでManjaroLinux上でKDE使ってるのが自分です。