最近Windows前提の開発環境で作業するプロジェクトが結構あったのですがそのときにつらいのがGitを中心とするコンソール作業。Windows TerminalとPowerShellの組み合わせは昔と比べるとはるかに快適ではあるものの。MacやLinuxでバキバキにカスタムしたZshに慣れている自分としては苦行に近いものがあります。
そんなときにまず思いつくのはWSL2です。もちろん使ってます…がWindows側のドライブ (/mnt/c/...
) においてあるGitレポジトリを触ると耐えがたいレベルで遅いことが発覚。WSL2はWSL2内のドライブで完結する場合は問題ないもののWindows側へのアクセスにパフォーマンス問題があるようです。
VMを利用していないWSL1なら良いかもしれませんが、すでにWSL2は別で利用しているので触りたくない、ということで第三の選択肢MSYS2を試してみました。
MSYS2とは
Windowsアプリケーションを開発するための開発環境というコンセプトだそうです。CygwinのようにPOSIX環境を完全再現することは目指しておらず、Windowsのツールセットと混ぜて使いやすいらしいです。パッケージシステムとしてはArch LinuxのようにPacmanを利用していて主要なUNIX的ツールをインストールできます。
MSYS2インストール
以降は執筆時点の最新のWindows 11の場合です。
MSYS2を普通にインストールします。最近のWindowsならWingetが最初から入っているのでPower Shellで
> winget install MSYS2.MSYS2
そのあとはMSYS2 / MSYS2をスタートメニューから開いて各種ツールをインストールします。ただし割とクセがありvimを入れてもviがaliasされないなどがある、そこは各自で直す必要がある。
$ pacman -S zsh vim ruby
.zshrcに追記する例
alias vi=vim
Windows Terminal
MSYS2のはminttyというterminalがデフォルトで付属しているのですがWindows Terminalのほうが使いやすいです。Windows Terminalの設定画面左したにOpen JSON fileというボタンがあるのでそこから設定ファイルを開き以下を追加。Zshの箇所とかフォントはお好みで。
"profiles":
{
...
"list":
[
{
"antialiasingMode": "cleartype",
"commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -msys -shell zsh",
"font":
{
"face": "Cascadia Mono"
},
"guid": "{71160544-14d8-4194-af25-d05feeac7233}",
"icon": "C:/msys64/msys2.ico",
"name": "MSYS / MSYS2",
"startingDirectory": "C:/msys64/home/%USERNAME%"
},
...
Git
個人的に最重要なGitです。MSYS2のGitも(WSL2とは別のなんらかの理由により)かなり遅いです。Git For Windowsを利用しましょう。まだ入ってない場合は入れておいてください。
PowerShell
> winget install Git.Git
さて、MSYS2ではデフォルトではsymlinkを作成できないため(オプションで複数の実装、挙動でのsymlinkが利用できるようです)、 /usr/bin/git
をこんなshell scriptにしたところ動作しました。
#!/usr/bin/sh
exec /c/Program\ Files/Git/bin/git.exe "$@"
MSYS2
$ chmod +x /usr/bin/git
Zshなどのプロンプトでbranch名や状態(clean / dirty)を表示している場合も問題なく動作してます。
~ $ cd /c/foo/bar/repo
repo git:(branch-name) ✗ $
↑ has changes
余談
Git For Windows自体はMSYS2のForkであり、MSYS2にGit For Windowsをインストールする手段というものが存在するようなのですが、無保証であり、自分が試したときにはうまくビルドできませんでした。そのため普通にWindowsにインストールされたものを利用しています。
余談2
WSL2と違いVMではないのでサーバーを建ててLAN内から参照できるようにすることも簡単で、設定の変更も不要です。例えばRubyの場合、以下で指定したディレクトリ内のファイルを公開できます。
$ gem install webrick
$ ruby -run -e httpd . -p 9000
# ここでUAC的なポップアップが出るので許可
結論
MSYS2を利用することでWindowsのディレクトリ、Windowsのワークフローを利用している場合でも快適にZshを利用しつつネイティブのツールを利用することができました。他の使えそうな選択肢は試していないのでこれがベストかは不明ですがすべてが快適に動作しているのでしばらくはこの構成のまま使う予定です。
試していないやつ↓
- WSL2からGit For Windowsを実行
- Git Bash (Git For WindowsについてくるBash)を使う
- MSYS2のforkであるためほぼ同じ操作感が得られそう
- PacmanがついてこないためZshやその他の追加インストールは難しいらしい。vimとBashくらいしか使わない人はいいかも
- WSL1とWSL2併用
- WSL1の将来性どうなんでしょうか。WSL1ベースのWindows Subsystem for Androidは終わるし
- Cygwin