Edited at

githubとrcmを使ったモダンdotfiles管理

More than 3 years have passed since last update.


dotfilesとは

*NIX系OSでよくある、ソフトウェアの個人設定ファイルのこと。

大抵$HOME直下に置かれ、先頭がドットで始まる隠しファイルなのでそう呼ぶ。


なぜdotfilesをgithubで管理すべきか

個人向けの設定ファイルをいろんな環境で使いまわすため。

そのために、githubはある意味最適の条件が揃っている:


  • インターネットさえあれば、どこからでもアクセスできる


  • gitがあれば、どこからでも変更の追跡ができる


  • gitがなくても、ブラウザからzipballやtarballでダウンロードできる

  • ブラウザがなくても、パーマリンクを使ってwgetcurlでダウンロードできる

  • ソースを公開していれば無料で使い放題


dotfilesを使いまわすときの問題


  • インストールが面倒くさい

これに尽きる。なので、大抵の場合インストールスクリプトを自作することになるが…


  • そもそも可搬性の高いシェルスクリプトを書くのが難しい


    • 非標準コマンドへの依存、bash依存 etc.



  • 複数の環境でのテストが面倒


    • Windowsは諦めるとしても、*BSD / OSX / Linux etc.




rcmで解決

https://github.com/thoughtbot/rcm


rcm

This is a management suite for dotfiles. See the tutorial to get started quickly.

It assumes that you have a separate dotfiles directory, or are interested in creating one.

The programs provided are rcup(1), mkrc(1), rcdn(1), and lsrc(1). They are explained in the tutorial and configured using rcrc(5).


名前(rc manager)の通り、dotfilesの管理ツール。

rcmというのはパッケージの名前で、

実際は複数のコマンドと1つの設定ファイルで構成されている。

これを使うと、


  • どの*NIX環境でもきちんとインストールできる

  • コマンド一発でアップデートできる

  • インストール/アップデートをフックしてスクリプトの実行ができる


  • rcm自体のインストールも、システムのパッケージ管理システムを使って行える

  • パッケージ管理システムがなくても、makeさえあればインストールできる

自前のスクリプトを使うのがバカバカしくなる。


rcmを使った管理

公式ドキュメントを見れば詳しく書いてあるが、雑に説明すると、


ディレクトリ構成

今からdotfilesを新たに用意したい場合は、thoughtbot/dotfilesをフォークすると、そのまま使える。

基本的には、ディレクトリのトップに、アタマのドットを抜いたファイル群を置く。

% find dotfiles

dotfiles/
dotfiles/vimrc
dotfiles/emacs.d/
dotfiles/tmux.conf
dotfiles/rcrc
dotfiles/hooks/
dotfiles/hooks/post-up

hooks/post-upにあるスクリプトは、rcupによるインストール/アップデートをフックして実行される。

アタマのドットがついたままだと、rcmに無視される。

これによって、.git.gitignoreなどのファイルが自動的に管理から外れる。

アタマにドットがついていないファイルを除外したい場合は、

rcmの設定ファイルrcrcに、以下を追記する:

EXCLUDES="README.md LICENSE"

中身はシェルスクリプトとして解釈されるので、=の間にスペースを入れてはならない。


rcup

dotfilesレポジトリが用意できたら、ローカルのホームディレクトリにクローンしておく。

初回はrcmをインストールしないといけないので、

公式のインストールガイドにしたがってインストールする。

Ubuntuならapt、CentOSならyum、OSXならHomebrewからインストールできるうえ、

./configure && make all installでもいける。

さて、インストールができたら早速、以下を実行する。

env RCRC=dotfiles/rcrc rcup

環境変数$RCRCrcmの設定ファイル(rcrc)の場所を指す。

上述のディレクトリ構成なら、$HOME/.rcrcができるので、次回からはrcupだけでいける。

rcupを実行すると、dotfiles以下のファイル群がアタマのドット付きでホームディレクトリに展開される。

展開直前に、hooks/pre-upスクリプトが(もしあれば)実行され、

展開直後に、hooks/post-upスクリプトが(もしあれば)実行される。

環境依存の設定は、hooks/post-upで書き換えると良い。

展開処理は、デフォルトでは以下のルールに従う:


  • ディレクトリは階層ごとにコピー

  • ファイルはシンボリックリンク

なので、新たに$HOME直下に(環境依存の)ファイルを作っても、リポジトリの管理下にはならない。

管理したくなったら、後述のmkrcを使う。


rcdn

簡単にいうとrcupの逆で、アンインストール専用のコマンド。

通常これを使うときは$HOME/.rcrcが存在するので、rcdnするだけでよい。

詳しい解説はしない。


mkrc

管理外のdotfilesをrcmの管理下に移すコマンド。

mkrc .vimrcのように使う。


lsrc

簡単にいうと、rcupのdry-runを行うコマンド。

管理中のファイルを確認したいときに使う。


TIPS

rcmと直接関係ないが、グローバルに使いまわすdotfilesの他に、環境依存の設定も使いたい場合、

設定ファイル内でローカル用の設定をインクルードするとよい。

たとえば、

https://github.com/thoughtbot/dotfiles/blob/master/zshrc

環境によってdotfilesの記述を変化させたい場合、hooks/post-upを使ってパッチを当てるとよい。

パッチファイルを別のディレクトリに隔離して.rcrc内で$EXCLUDESしておくと、それ自体の管理も綺麗にできる。

.rcrc$COPY_ALWAYS変数に書き換えるファイルを指定しておけば、リポジトリも汚れない。