生きることは忘れること

私のdotfiles

dotfilesとは何かという説明は今日から始めるdotfiles、そして4年間ずっと使っている自作コマンドの話 - 天才クールスレンダー美少女になりたいなどに譲るとして、私も重い腰をあげて夏あたりから自分のdotfilesリポジトリを作り始めています。リポジトリを建立したのは去年の12月で、そこから半年間“initial commit”だけの状態で放置されていたのはさておき。

実のところ私は自分を本質的にはWindowsユーザーでありGUIユーザーだと思っているのだが、そうは言ってもいろんなサーバだとか転がっているラズパイだとかを含めて管理している環境はそこそこの数になる。そんなわけでいい加減やらないと回らなくなってきたというのが実情だ。そういうことだから複数台で環境を統一することが目標になるが、その一方で用途も性格も異なる不均質なマシン群であるから必要に応じて差異のある部分を取り扱えることも不可欠となってくる。dotfilesリポジトリ管理の要領にはいくつか流派があるが、適当なインストール用シェルスクリプトを書いて雑にファイルを全部シンボリックリンクあるいはコピーするというような仕組みだとどうにも厳しそうだ(というかそもそもそのやり方って更新はまともに回せるものなんだろうか?)。dotfiles管理ツールの出番である。

結論からいうとchezmoiを選定しました。私の知り合いの某氏も同じ選択をしていたのでオタクが吸い寄せられるツールではある気がします。公式に載っているpackage installのコマンドでUbuntuがないのにArchとかNixOSとかが並んでいる時点で信頼できる。Go言語で書かれていてシングルバイナリなのでいざとなればだいたいの環境で使えそうなのも好感が持てます。環境構築を一発でできるようにするために使うのにその手前にPythonインストールバトルをやってたら世話がないですからね。そしてGo言語のテンプレート記法(つまりそれなりに標準的な記法)を用いたテンプレート機能でマシン間の差異をパワフルに取り扱える。最後のこれがもちろん最大の決め手です。

私はシェルもエディタも大したカスタマイズをしていないので(それもそれでどうかと思うところはあるが)、分量も大したことはない。解決したい問題の根幹は何だったかというと、rbenvとかnvmのようなホームディレクトリ下にインストールする(OSのパッケージマネージャを使わずにインストールし、シェルの設定ファイルでPATHを通す)類のソフトウェアの設定が .bashrc などに散らかっており、ちょっとした設定を移植したい場合でもマシンによってnvmがあったりなかったりする以上単純にコピーするだけとはいかないということである。chezmoiのテンプレートはこれをきっちり解決してくれるし、さらに外部ファイルをインクルードする機能もあるので「ホームディレクトリ下にインストールする」ことの中身が単にGitリポジトリをクローンしてくるだけであればそれも扱えてしまう。このあたりは大変に気が利いていて、こういう機能があることで簡易なユーザレベルのパッケージマネージャとしても使える。すなわち、新しいマシンでrbenvをインストールしたいときは、chezmoi自身に食わせる設定ファイルに仕込んでおいた rbenv = true という行のコメントを外してから chezmoi apply を叩けば、rbenvもruby-buildも勝手にクローンされて .bashrc も書き込まれる。そして最後に source .bashrc なりシェルを起動し直すなりすれば、rbenvのインストールコマンドを一切思い出さずにrbenvが使えるようになる。environment as codeの実現である。

ホームディレクトリ以下のソフトウェア管理に軸足を移して探してみれば、Nix言語で書かれたhome-managerというのもある。真面目に検討はしてみたのだが、Nix言語自体に相当な癖と思想があるのもさることながら、 /nix などというルート直下のディレクトリが実質的に必須であるという仕組みで、システムワイドな領域にデータを突っ込むソフトウェアであるのが痛い。root権限を持っていないマシンは完全に諦めることになる。Nixのエコシステムをシステムのパッケージマネージャとして(も)使うNixOSというOSがあり、Nixの真価はそちらで発揮されるのではないだろうか。とはいえ、宣言的かつ再現性を持った環境構築の手段として魅力的には見えるのだが、ぶっちゃけ調べただけで実用的な場面で使えてはいない。もし機会があれば稿を改めて述べたいが、とりあえずはHERP における Nix 活用 - blog.ryota-ka.meなどを文献として挙げておく。

ところで、zshのカスタマイズ(というより、カスタマイズの基礎となるzsh自体の機能・動作)について体系的に解説された情報について心当たりのある方がおられましたら是非お知らせくださるとありがたいです。