Edited at
qnoteDay 5

GNU Stowでdotfilesを管理する


はじめに

パソコンの初心者ではない限りは、新しいOSを入れるまたはOSの再インストールするときにアプリのインストールや好みの設定をつけるなど環境構築をやっているでしょう。技術が大好きな人間として、VMを立てたり、色んなOSを試したりするので環境構築作業を結構やっていました。

しかし、去年の12月頃に環境構築の作業が面倒だと感じていましたので、何か良い方法があるかググってみて、dotfilesという手段を見つけました。


dotfilesって何?

ターミナルでls -la ~を実行してみれば、

image.png

ファイル名の前に.がついているファイルはdotfileと呼ばれています。大抵dotfileのなかにアプリごとの設定が書いてあるので、これがあればアプリのコンフィグレーションを簡単に再現できます。


dotfilesをつくりましょう!

今回は二つのやり方を紹介したいと思います。


レベル1:コピペ+symlink

これはQiitaで検索すると色んな手法が出てくるので、詳しいやり方は省略させてもらいます。基本は、


  1. 管理したいdotfilesを一つのフォルダにまとめる

  2. 各dotfileのsymlinkを作る(手動では面倒なのでbashスクリプトがオススメ)

  3. フォルダーをどこかのクラウドにアップして常に同期する(Dropbox、Githubなど)


問題点


1. bashスクリプト

僕自身あまりbashスクリプトを書かないので、数ヶ月も経つと「これ、なにやってんの?」となることが多いです。

# -fってなんでしたっけ?-Lは?

if [[ -f $HOME/.zshrc && ! -L $HOME/.zshrc ]]; then
echox " "
echox ".zshrc exists. Renaming to .localrc..."
mv $HOME/.zshrc $HOME/.localrc
fi


2. 柔軟性がない

仕事用の端末でbashスクリプトを実行したときに、プライベートでしか使わないソフトの設定が入ってしまいました。もちろんスクリプトを修正すればなんとかできますが、そういう修正は同期したくないので困っていました。


3. symlinkを管理するのが難しい

dotfilesが増えるほど管理するのが大変です。特に間違えてsymlink作ったファイルは、いちいち削除や修正が必要です。しかも、

$ ln -s [リンク元] [登録名]

or
$ ln -s [登録名] [リンク元]

って何回も覚えられないんだよ!


レベル2:GNU Stowを使う

dotfilesの管理ツールGNU Stowを紹介します。元々はパッケージを導入するときに環境を汚さないようにsymlinkで管理するパッケージです[1][2][3]が、dotfilesの管理にもかなり役に立ちます。

例として、zshのコンフィグファイルを導入するときに:

$ stow -v zsh

また、gitのコンフィグファイル:

$ stow -v git

複数コンフィグを導入する場合:

$ stow -v zsh vim tmux

コンフィグの削除も楽:

$ stow -vD tmux

なんて素晴らしいツールですわー


Stowの使い方


1. ファイル構成を建築

Stowを使う前に、特定のファイル構成を作らなければならないです。ソフトごとにフォルダーを作り、関連なdotfilesを入れることが必要です。そして、現状のdotfilesのフォルダー構成を合わせることも必要です。例:

dotfiles/

├── fuga/
│ └── .config/
│ └── .fuga
├── hoge/
│ └── .config/
│ └── .hoge
├── vim/
│ └── .vim/
│ ├── theme.vim
│ └── .vimrc
└── zsh/
├── .zshrc
└── .zsh/
├── alias.zsh
├── keybindings.zsh
├── plugins.zsh
└── prompt.zsh


2. Stowを入れる

macOSを使う場合はhomebrewで入れましょう:

$ brew install stow


3. 既存のdotfileが削除されたか確認

既存の場所にすでにファイルが存在する場合はstowが上書きせずに中止するという安全対策があると安心ですが、削除しないとsymlinkが作れないので確認しましょう


4. Stowを実行

いよいよ本番です。上記の例に続いて、以下のコマンドを実行したら:

$ cd dotfiles

$ stow -v fuga hoge vim zsh

結果はこうなります:

~/

├── .config/
│ ├── .fuga
│ └── .hoge
├── .vim/
│ ├── theme.vim
│ └── .vimrc
├── .zshrc
└── .zsh/
├── alias.zsh
├── keybindings.zsh
├── plugins.zsh
└── prompt.zsh


結論

Stowを使うと、

* bashスクリプトを書かなくてよくなる

* 必要なコンフィグだけを導入できる

* symlinkの管理が楽になる

dotfilesの初心者でも上級者でも、オススメできるやり方じゃないかなって思っています。

最後に、実例を見たい方は僕のdotfilesのGithubリポーを是非参考にしてください!