s1m4ne.dev
Published on

GNU Stowでdotfilesのシンボリックリンクを管理する

Authors

はじめに

研究の実験環境としてminikubeを使っているんですが、このごろターミナルを使う頻度が増えてきています。コードを書くときはVSCode内蔵のターミナルやmacデフォルトのターミナルアプリでもどうにかなりましたが、インフラ関連のことをやりたいとなると追加のソフトが必要です。

tmuxやzshのプラグインなどを追加するとかなり使いやすくなります。最近は色んなOSSを試しているのですが、Vimにはなかなか踏み出せていないのでいつか使えるようになりたいです...。

今回はdotfilesを導入する一環でGNU Stowを使った方が便利そうだと思ったので、簡単な概要や使い方についてまとめていきます。

dotfilesを導入する目先のメリットはあんまなさそうなんですが、雑多に管理されている設定ファイルの見通しは良くなると思います。またGit管理をしていればいつかメリットを感じる日が来ると思います。

dotfilesとは?

ホームディレクトリ(~/)にある設定ファイルのことを指します。.zshrcなどの設定ファイルが有名でドットから始まっていることからdotfilesと呼ばれています。

このように設定ファイル自体をdotfilesとも表現しますが、一般的には設定ファイルの管理手法だったり設定ファイルが格納されたリポジトリのことをdotfilesと言います。

GitHubでdotfilesと検索するとこんな風にたくさんのdotfilesが公開されていることがわかります。

これは「GitHub側にdotfilesを公開してくれる便利な機能がある」というわけではなくて、文化的にdotfilesという名前のリポジトリとして設定ファイルを公開しているだけです。

image-20251004212413373

dotfilesの管理方法

たくさんのdotfilesがGitHubで公開されていますが、ローカルでの管理方法がある程度慣習として決まっています。

設定ファイル(例:.zshrcなど)はホームディレクトリ直下(~/)にあるので直接的にGit管理するは難しいです。そこでホームディレクトリ直下にdotfiles/を作成して設定ファイルを全て移動します。このdotfiles/をGit管理することでGitHub上でも公開することができます。

しかし移動したままではホームディレクトリ直下から設定ファイルがなくなってしまいます。そこで元の位置(ホームディレクトリ直下)に設定ファイルのシンボリックリンクを作成することでこの問題を解決します。

シンボリックリンクのイメージはこんな感じです。ホームディレクトリに.zshrcというシンボリックリンクを作成して、その実体がdotfiles管理下(dotfiles/zsh/.zshrc)にあります。こんな感じでファイルの実体を参照する仕組みになっています。これでファイルの実体だけをGit管理できます。

$ ls -la
lrwxr-xr-x    1 User  staff      Oct  4 18:39 .zshrc -> dotfiles/zsh/.zshrc

GNU Stowとは?

先ほど説明したシンボリックリンクですが、設定ファイルの数だけ全て自分で張る必要があります。シンボリックリンクを作成するコマンドはこんな感じです。

ln -s ~/dotfiles/zsh/.zshrc ~/.zshrc

手動でやるのは大変なので、通常はシンボリックリンクをシェルスクリプトなどで自動化して作成しますが、それをやってくれるのがGNU Stowです。なのでシンボリックリンクを張ってくれるだけのツールなので、設定ファイルを~/dotfiles/に移動するのは自分でやる必要があります。シンプルなツールです。

stowコマンドについて

stowコマンドはシンボリックリンクを作成するコマンドです。引数にカレントディレクトリ直下のサブディレクトリを指定することで、カレントディレクトリの一つ上の階層にリンボリックリンクを作成します。

例えばdotfiles/に設定ファイルを以下のように配置したとします。分類用のディレクトリとしてbaseconfigzshを作成しています。そしてその中に設定ファイルを配置しています。

~/dotfiles
├── base
│   ├── .gitconfig
│   ├── .tmux.conf
│   └── .vimrc
├── config
│   └── .config
│       ├── alacritty/
│       └── nvim/
└── zsh
    └── .zshrc

上記のようなディレクトリ構成の場合、設定ファイルが入っているサブディレクトリを引数として実行してあげれば、ホームディレクトリ直下に設定ファイルのシンボリックリンクが配置されます。

stow base
stow config
stow zsh

実行後はこんな感じになります。

$ ls -la ~
total 32
drwxr-xr-x   8 user  staff   256 Oct  5 12:34 .
drwxr-xr-x   4 root  staff   128 Oct  5 10:00 ..
lrwxr-xr-x   1 user  staff    28 Oct  5 12:34 .gitconfig -> dotfiles/base/.gitconfig
lrwxr-xr-x   1 user  staff    27 Oct  5 12:34 .tmux.conf -> dotfiles/base/.tmux.conf
lrwxr-xr-x   1 user  staff    25 Oct  5 12:34 .vimrc -> dotfiles/base/.vimrc
lrwxr-xr-x   1 user  staff    23 Oct  5 12:34 .zshrc -> dotfiles/zsh/.zshrc
lrwxr-xr-x   1 user  staff    28 Oct  5 12:34 .config -> dotfiles/config/.config
drwxr-xr-x   7 user  staff   224 Oct  5 12:34 dotfiles

手順

実際にdotfilesを導入する手順を紹介します。

1. GitHubでdotfilesリポジトリを作成する

まずGitHub上で作成します。

2. ホームディレクトリでgit cloneする

先ほど作成したdotfilesリポジトリをホームディレクトリでクローンしてください。

3. 設定ファイルを~/dotfilesに移動する

設定ファイルを~/dotfilesに移動します。

この際に分類用のサブディレクトリを作成することができます。例えば私の場合は以下のようにzsh関連の設定ファイルだけディレクトリを分けています。configに関しては構造が他と違うので専用のconfig/を作成しています。

~/dotfiles
├── base
│   ├── .gitconfig
│   ├── .tmux.conf
│   └── .vimrc
├── config
│   └── .config
│       ├── alacritty/
│       └── nvim/
└── zsh
    └── .zshrc

上記の例ではサブディレクトリで分類しましたが、直接配置することも可能です。その場合stow .でシンボリックリンクを作成することになります。

※注意点 .sshなどの機密情報が入ったファイルはdotfiles/に移動させないでください。GitHub上に公開されることになります。

4. GNU Stowのインストール

インストールしてください。

brew install stow

5. ディレクトリ移動してシンボリックリンクの作成

stowコマンドは引数にサブディレクトリを指定します。もしサブディレクトリを作成していない場合はstow .で作成できます。

cd ~/dotfiles

stow base
stow config
stow zsh

6. 確認

こんな感じになります。

$ ls -la ~
total 32
drwxr-xr-x   8 user  staff   256 Oct  5 12:34 .
drwxr-xr-x   4 root  staff   128 Oct  5 10:00 ..
lrwxr-xr-x   1 user  staff    28 Oct  5 12:34 .gitconfig -> dotfiles/base/.gitconfig
lrwxr-xr-x   1 user  staff    27 Oct  5 12:34 .tmux.conf -> dotfiles/base/.tmux.conf
lrwxr-xr-x   1 user  staff    25 Oct  5 12:34 .vimrc -> dotfiles/base/.vimrc
lrwxr-xr-x   1 user  staff    23 Oct  5 12:34 .zshrc -> dotfiles/zsh/.zshrc
lrwxr-xr-x   1 user  staff    28 Oct  5 12:34 .config -> dotfiles/config/.config
drwxr-xr-x   7 user  staff   224 Oct  5 12:34 dotfiles