engineering 社内向け技術文書

rcmを使ってdotfilesを管理する

engineering 社内向け技術文書

thoughtbot/rcm は、thoughtbot社が開発したdotfileの管理を行うためのシェルスクリプト群です。似たようなツールとして technicalpickles/homesick がありますが、homesickがRubyGemsなのに対してrcmはシェルスクリプトのみで作られており、依存が少ない点がメリットとして上げられます。

「dotfiles」とは

dotfilesとは、Unix系OSでユーザのホームディレクトリにある . (ドット)から始まるファイル群の総称です。.bashrc などのプレーンテキストの設定ファイルや、 .vim/.emacs.d/ 等の特定のアプリケーションの設定を保存ディレクトリ、 .config/ のような様々なアプリケーションの設定を保存する親ディレクトリなどがあります。

シェルやエディタをどの程度カスタマイズするかという点については様々な考え方がありますが、dotfilesは「普段の自分の環境」を構成する大切な要素の一つであることは間違いありません。

「dotfilesを管理する」とは

GitHubを「dotfiles」で検索 すると、多くの人がdotfilesをバージョン管理していることがわかります。

さて、前述した通りdotfilesというのはホームディレクトリにあるファイル群です。通常、バージョン管理はあるディレクトリの中を対象として行いますが、dotfilesをバージョン管理するためにホームディレクトリをまるごと管理しようとすると、.gitignoreを駆使してもかなり煩雑なものになってしまうでしょう。

そこで、多くの人はシェルスクリプトや何らかのスクリプト言語で書かれたプログラムを用意し、別のディレクトリにあるdotfilesからホームディレクトリにsymlinkを作成するような運用をしています。そうすることで、ホームディレクトリそのものをバージョン管理することなく、dotfilesだけを管理することができるようになります。この「symlinkを作成する」ことをサポートするツールがrcmです。

例) 私のホームディレトリの一部。.zprofile.zshrcがsymlinkになっています。

lrwxr-xr-x ... .zprofile -> /Users/kenchan/dotfiles/zprofile
drwxr-xr-x ... .zsh
-rw-r--r-- ... .zsh-update
-rw------- ... .zsh_history
lrwxr-xr-x ... .zshrc -> /Users/kenchan/dotfiles/zshrc

rcmの4つのコマンド

rcmは4つのコマンドでdotfilesの管理を助けてくれます。それぞれ簡単に紹介します。

rcup

rcupは、rcmで管理しているdotfilesのsymlinkをホームディレクトリに作成するためのコマンドです。新しいマシンをセットアップするときなどに、dotfilesを手元に持ってきてから最初に叩くコマンドはこれになるでしょう。

mkrc

mkrcは、ホームディレクトリにあるファイルを新しくrcmの管理下にするコマンドです。

例えば、.bashrcを新しくrcm管理にする場合は以下のようになります。

$ ls -alh .bashrc
-rw-r--r-- ... .bashrc
$ mkrc .bashrc
$ ls -alh .bashrc
lrwxr-xr-x ... .bashrc -> /Users/kenchan/dotfiles/bashrc

rcdn

rcdnは、rcupで作成されたsymlinkを削除するコマンドです。symlinkが削除されても実ファイルは残りますので、rcupしなおせば戻すことができます。

lsrc

lsrcは、rcmで管理されているファイルの一覧を表示するコマンドです。rcmは複数のディレクトリを扱うこともでき、symlinkの実体がどのディレクトリにあるかも確認できます。

下の例では、.bashrcの実体はdotfiles-localディレクトリにあり、.gitconfigdotfilesディレクトリにあることがわかります。

$ lsrc
/Users/kenchan/.bashrc:/Users/kenchan/dotfiles-local/bashrc
...
/Users/kenchan/.gitconfig:/Users/kenchan/dotfiles/gitconfig
...

rcmのはじめ方

まだdotfilesを管理していない人は、rcmのインストール方法を見ながらインストールし、mkrcで管理したいファイルを追加していくとよいでしょう。デフォルトでは~/.dotfilesというディレクトリに実体がコピーされ、ホームディレクトリにはsymlinkが作成されます。あとは~/.dotfilesをバージョン管理し、GitHub等にpushしておけばよいでしょう。

また、rcmは.rcrcファイルという設定ファイルを見ることになっています。ここにDOTFILES_DIRS=(ディレクトリ)という設定を書くことで、dotfilesの実体を置くディレクトリを指定できます。dotfilesをdropboxで管理したいというような場合は、この設定を使うと簡単に実現できます。

もし「これから環境を作っていきたいけどどこから手をつけていいかわからない」という状況であれば、rcmの開発元であるthoughtbotのオススメ設定( thoughtbot/dotfiles )をcloneして使いはじめるのもオススメです。

既に別の方法でdotfiles管理をしているという人がrcmに移行する場合は、少し工夫が必要かもしれません。rcmは「ディレクトリは作成し、ファイルはsymlinkにする」ということを行います。もし、現在の管理方法がディレクトリもsymlinkにするような仕組みになっている場合、その配下にある意図しないファイルまで管理下に置かれてしまう可能性があります。特に、GitHub等でdotfilesを公開している人はcommitやpushの段階でよく確認しましょう。

おわりに

私は、少し前まで自作のスクリプトでdotfilesのsymlinkを管理していましたが、特に.config/配下の管理に限界を感じていました。それをWeb日記( fishを使いはじめた けんちゃんくんさんのWeb日記 )に書いたところ、 @ursm さんからrcmを教えてもらい、試してみたところとても便利だったのでrcmに移行しました。

もし、私と同じように現状の管理方法に不満がある方や、これからdotfilesを管理しようという人は、ぜひrcmを試してみてください。

参考リンク