Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
72
Help us understand the problem. What are the problem?
@manicmaniac

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

dotfilesとは

*NIX系OSでよくある、ソフトウェアの個人設定ファイルのことです。
大抵$HOME直下に置かれ、先頭がドットで始まる隠しファイルなのでそう呼びます。

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

個人向けの設定ファイルをいろんな環境で使いまわすためです。
そのために、githubはある意味最適の条件が揃っています:

  • インターネットさえあれば、どこからでもアクセスできる
  • gitがあれば、どこからでも変更の追跡ができる
  • gitがなくても、ブラウザからzipballやtarballでダウンロードできる
  • ブラウザがなくても、パーマリンクを使ってwgetcurlでダウンロードできる
  • ソースを公開していれば無料で使い放題

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

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

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

  • そもそも可搬性の高いシェルスクリプトを書くのが難しい
    • 非標準コマンドへの依存、bash依存 etc.
  • 複数の環境でのテストが面倒
    • Windowsは諦めるとしても、*BSD / OSX / Linux etc.

ということで、厄介ごとが多いです。

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変数に書き換えるファイルを指定しておけば、リポジトリも汚れなくて便利です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
72
Help us understand the problem. What are the problem?