Windowsでもdotfiles管理がしたい - 或いは dotter用例
「Windows(非・wsl)でもdotfiles[1]管理がしたーい」とは思うものの、やはりそういった記事は少ないし、それ用の管理ツールでWindows対応が明言されているものも多くはなさそう[2]
けれども、珍しく(?)Windows対応が明言されていて、かつシンプルでわかりやすそうなdotterというrust製dotfiles管理ツールがあって、四月ごろから気になっていました
んで、やっとこさ重い腰を上げて手を出してみた
前準備
sudo
dotfiles管理において一つ重要なものがあるようで、それをシンボリックリンクと言うらしい
しかし、windowsにおいてそのシンボリックリンクを作成できるコマンドであるmklink
を使って試してみても、ユーザー権限のコマンドプロンプトだと権限がないと出て作成できない(同様の機能を持つツールなどでも同様)
これ(というか、シンボリックを作成する機能)を利用できるようにするには管理者権限のコマンドプロンプトを起動して実行する必要があるようだけど、いちいちポチポチと操作して管理者権限で新しくウィンドウを開くのも面倒
なので、作業の簡略化のためmattn/sudo(紹介記事)を導入しておくとよさそう(デプロイするだけならいらないかもだけど、いろいろと試す場合は)
開発者モードとやらなら管理者権限がなくとも使えるようになるらしいけど、副作用を嫌ったのとよくわからなかったので未試用
シンボリックリンク
シンボリックリンクはdotterによっても使われるけど、dotterは~
は展開してくれるものの~/.config
は展開してくれないため、簡略化のためにこちらでも張っておいたほうがよいと思う(Linuxエミュレーションだと問題なかったりするのかな?)
以下では%userprofile%\.config
を%appdata%
(windows環境における~/.config
相当)として扱うリンクを張っています
上記の通りそのままでは実行できないはずなので、適宜頭にsudo
とつけるなどして対処すべし
mklink /d %userprofile%\.config %appdata%
※7/18日追記
今更過ぎて申し訳ないのですが、上記のコマンドの頭にただ単純にsudo
とつけても恐らく動作しません(私の環境にて確認しました)
私が代替としてlnコマンド(の代替品)を使用した際には正常に作成出来たが故のものですので、sudoのREADMEも見てみるにsudoが外部バイナリ以外のもの(つまり組み込みコマンド)を実行できないのではないかなと思います(mklinkが組み込みコマンドなの、意外)
なので大人しく管理者権限のコマンドプロンプトを立ち上げるか、以下のようにして対処します
sudo cmd /c mklink /d %userprofile%\.config %appdata%
# lnがある場合こちらでもよい
sudo ln -s %userprofile%\.config %appdata%
dotterの設定
wikiのこのページに詳しく説明がある
大まかには
- まず
%userprofile%
以下などに.dotfiles
などとしてディレクトリを作成し、そこに管理したい設定ファイル群を移動する - そのディレクトリにておもむろに
dotter init
して関連ファイルを作成しておく。ついでにwikiにあるように.gitignoreも設定しておく -
.dotter
ディレクトリ以下にあるglobal.tomlを設定する - local.tomlを設定する。はじめは
packages = ["default"]
と書いておくだけでたぶんok - デプロイ(展開)する
となる
global.tomlの設定
左辺がdotfiles内でのファイル/フォルダ位置(実体がある位置)で、右辺がリンクを張りに行く側の位置になる
詳しくはwikiを参照
注意として、左辺の値は好きに設定できるが、dotfiles内の実ファイル位置と合致しないとエラーが出る(当たり前の話だけど、これを忘れててちょっとハマった)
あとはwikiにもあるようにとりあえず[default.files]
以下にばーっと書いていけばいいのだけども、これもちょっとだけ注意点があって、
- 上に書いたように
~
は展開されるが~/.config
は展開されない- ので、上記のようなシンボリックリンクを張っていなければ、windows用に似たような設定をつらつらと書いていかないといけなくなる(少なくともcmd.exeを使う場合は)
- ファイル内に
{{
という文字列があるとテンプレートファイルとして認識されるので、symlinkでなくファイルコピーとなってしまったりエラーが出たりする- vimrcとか
- なので、上記リンク先の項にあるように
type = "symbolic"
と明示的に指定する必要がある(詳しくは例を参照)
私の設定例
こんな感じになりました
たぶんLinuxでも共通で使えることでしょう(適当)
# on windows: mklink /d %userprofile%\.config %appdata%
[default.files]
# https://github.com/SuperCuber/dotter/wiki/Setup-and-Configuration#complex-target
# ".vimrc" = "~/.vimrc"
".vimrc" = { target = "~/.vimrc", type = "symbolic" }
".config/bat/config" = "~/.config/bat/config"
".config/bottom/bottom.toml" = "~/.config/bottom/bottom.toml"
".config/helix" = "~/.config/helix"
".config/pet/snippet.toml" = "~/.config/pet/snippet.toml"
".config/rhq/config.toml" = "~/.config/rhq/config.toml"
local.tomlの設定
マシン固有の設定(らしい)
includesでOS(ディレクトリ構成)を切り分けるならまだしも、個人的にはpackages = ["default"]
と書いてあるだけになっています
includesの利点は個別にファイル位置を上書きできることだと思うのだけど、それにあまり価値を感じなくて設定全体も小さいのなら、別にパッケージで切り分けてしまってもいいのかなと思った
パッケージで切り分けるというのは、基本的にデフォルト・windows・linuxの三つとかで運用して、特別に切り分けたいものがあったとしたらそれも個別のパッケージに切り分けて、そこでもOSで切り分けたい設定があるのならファイル分割を検討するかなぁみたいな
デプロイ
オプションとして-d
(--dry-run
)というのがあって、基本的にはsudo dotter deploy -d
と試してみて想定外がないか確認して、うまくいくようであれば-d
なしでやる、ということになると思う[3]
undeploy(張ったリンクの削除)時は、削除するリンク以外にそのフォルダにファイルがない場合フォルダを削除されるか尋ねられるので、削除する場合は-y
(--noconfirm
)オプションをつけてdotter undeploy -y
とすると良いかと思われる
削除したくない場合はyes n | dotter undeploy
のような感じにするとよさそう(yesコマンドは各自調達してください)
ただし、弊環境だとすべてにnと答え終わってもyesの入力が続くためか、わざわざその後にCtrl-cを押す必要があるので削除してしまったほうが楽ではありそう(わざわざ残す意味も薄いでしょうし)
まとめるとこんな感じ
# 前確認
sudo dotter deploy -d
# デプロイ
sudo dotter deploy
# 撤収
dotter undeploy -y
結論
-
~
と~/.config
を%USERPROFILE%
と%APPDATA%
に展開できさえすればあらかたなんとかなりそう - dotter割といい感じ
-
~/.config
展開してくれないのだけ惜しいけどsymlink追ってくれるのでなんとかなる
-
以上です
Discussion