最近、Windows のパッケージマネージャーとして WinGet を使うのが主流になってきている気がします。ただ、私の場合は WinGet と Scoop の両方を使い分けておりまして(本当はどっちかに絞りたいけど)。
そこで、なんでこんな使い方をしているのか、この機会に整理してみることにしました。
使い分けの基準
以下の条件にヒットしたアプリは WinGet で、それ以外は Scoop みたいに振り分けてます。
条件
アプリ自体に自動更新機能がある → WinGet
理由
自動更新後の資材が Scoop 以外のディレクトリに保存されるため
例
Chrome、Visual Studio Code、Postman、など。
以前までは、上記のアプリは Chocolatey でインストールしていましたが、WinGet が登場すると、ただ Microsoft 公式だからという理由でそちらに移行しました。
WinGet ではなく、Scoop を使っている理由
あくまで個人の好みの問題ですが、Scoop を気に入っているポイントとしては以下の3つがあります。
1. 環境変数の PATH が荒れない
これは長年同じ PC でいろんな開発作業を行うと直面する課題と思っているのですが、 winget とかでいろんなツールをインストールすると、 PATH に登録されるパスが増えます。
そうなると、どのパスの実行ファイルが効いているのか判断がすぐできず、謎に古いバージョンを使っていたり、いちいち優先的に検索させたいパスを最初の方に持ってきたりする必要が出てきます。
ただ、これって winget のせいではなくて、 Windows で開発する上でしょうがなく我慢しなくてはいけないポイントです。
Linux では、/usr/bin
配下にインストールしたバイナリへのシンボリックリンクを貼るようにすれば、いちいち PATH を更新しなくてもいいんですよね。
特に update-alternatives とか使うと便利でして。
ただ、 Scoop では ~\scoop\shims
ディレクトリ配下を /usr/bin
的な使い方にしているので、 PATH が荒れないようにしてくれてます。これが地味なんですが、意外と開発者体験を上げてくれるんですよね。
2. バージョンが簡単に切り替えられる
例えば、Java の JDK 17 と JDK 21 の両方をインストールしている環境の場合、以下のようにコンソールの再起動なしで簡単に切り替えられます。
# JDK17 と JDK 21 をインストール
scoop install java/temurin17-jdk java/temurin21-jdk
# 最後にインストールした temurin21-jdk に対して JAVA_HOME と PATH が設定されている
$env:JAVA_HOME; java -version
#=> C:\Users\nimzo6689\scoop\apps\temurin21-jdk\current
#=> openjdk version "21.0.5" 2024-10-15 LTS
#=> ...
# JDK 17 に切り替え
scoop reset temurin17-jdk
# JDK 17
$env:JAVA_HOME; java -version
#=> C:\Users\nimzo6689\scoop\apps\temurin17-jdk\current
#=> openjdk version "17.0.13" 2024-10-15 LTS
#=> ...
Java で書いてますが、 Node.js や PHP、 Go 辺りも同様です。ただ、 Python とかだと pyenv などの仮想環境でプロジェクト配下に python3.exe が入るのでグローバルの Python バージョンを切り替えようとしたことはないですね。
こういった言語のバージョンの切替って、その言語に特化したバージョン切替ツールを使うのがメジャーですが、JDK のバージョン管理ツールとして使用されることが多い SDKMAN! や jEnv は Windows には非対応なので、私の場合はここも Scoop でやっちゃつてます。言語特化型ではないバージョン切替ツールとして asdf がありますが、これも Windows は非対応なんですよね。(WSL では動く)
ただ、Scoop をバージョン切替ツールとして使う場合、上記のツールと比べるとちゃんとデメリットもあります。
JDK の場合で説明すると、まずプロジェクトで固有の JDK バージョンを指定したい場合に .sdkmanrc などでバージョン情報を共有できるファイルなどはないです。
次に、この scoop reset
ですが、他の JDK を scoop update
で更新した際に自動で上書きされます。そのため、JDK 21 を使っていて、 JDK 17 だけ更新したら、JAVA_HOME と PATH も JDK17 に向いてしまった、という状況になります。
ただ、現場で Java 使っていた時に 5 年ぐらいこの運用でやってましたが、そこまで困ったことにならなかったので、意識低いかもですがこれに定着しています。
※ WSL を使っていない時点でこの辺の意識は低くなりがち。でも、メモリには優しいよ!
3. アンインストールが楽
これは winget の愚痴になってしまいますが、 winget のアンインストールってなぜか安定していない印象があるんですよね。別に appwiz.cpl を開いて手動でアンインストールできるので、詰まったりはしないのですが。
あと、アンインストールするときに、設定情報も含めて根こそぎ削除したいときに、いちいちホームディレクトリや AppData 配下の設定ファイル、レジストリを削除する必要がなくて、 scoop uninstall --purge <app>
で消せるのも中々ポイント高いです。(全部のアプリでそれができるってわけではないけども)
全アプリが ~\scoop\
にあるので、容量食っているアプリを特定するのも楽ですし、コマンドに頼らなくても手動で簡単に消せるのも、割と安心感が持てます。
おわりに
以上、Scoop をまだ使い続けている理由でした。
まだ使ったことがない Windows ユーザの方は、よかったら使ってみてください。