tl;dr
winget 使うなら、開発者モードは絶対にオン!
対象読者
- Windows ユーザー
- CLI にそこそこ慣れている
- winget を使っている、または使いたい
WinGet とは
- Windows 公式のパッケージ管理ツール
- 他 OS では apt、yum、Homebrew とか
使い方 (fzf の例)
winget install --id junegunn.fzf
これで fzf コマンドが使えるようになります。
開発者モードとは
本来はWindows でアプリの開発・デプロイ・テスト向け機能を有効にする設定です。
で、WinGet に開発者モードが必要、と?
いいえ。
しかし事実上必須レベルの強い推奨。
どういうこと?
これを説明するには、WinGet で CLI アプリをインストールする際の挙動を知る必要があります。
fzf インストールの流れ
(1/3)
以下パスに portable install する:
%LOCALAPPDATA%\Microsoft\WinGet\Packages\junegunn.fzf_Microsoft.Winget.Source_8wekyb3d8bbwe\
(2/3)
以下パスに実行ファイルの シンボリックリンク を作成:
%LOCALAPPDATA%\Microsoft\WinGet\Links\
(3/3)
PATH ユーザー環境変数に以下があるかどうか検証し、なければ追記:
%LOCALAPPDATA%\Microsoft\WinGet\Links\
これらの工程が ユーザー権限 で実行されます。
この時点で、勘の良い方は気づくかもしれませんね。
管理者権限でできること
-
HKLMレジストリや%PROGRAMFILES%への書き込み - シンボリックリンク の作成
- 他、システム全体に影響する操作
開発者モードでは、ユーザー権限でシンボリックリンクを作成できます。
つまり、開発者モードなしでは シンボリックリンク作成に失敗 するわけです。
ということは、開発者モードなしでインストールできない?
いいえ、インストール自体は成功 します。
フォールバック処理による救済措置を行うことで、前例の場合問題なく fzf が使えます。
フォールバック処理
PATH に fzf のパスを直接追記する:
%LOCALAPPDATA%\Microsoft\WinGet\Packages\junegunn.fzf_Microsoft.Winget.Source_8wekyb3d8bbwe\
やっぱり開発者モードは不要?
はい、しかし 事実上必須レベルの強い推奨 です。
どういうこと?
あなたはいくつ CLI アプリを入れますか?
atomicparsley, bitwarden, chezmoi, dprint, eza, fastfetch, fzf, gh, ghq, git, glow, gpg, imagemagick, mise-en-place, neovim, psmux, pstop, ngrok, ripgrep, sqlite, worktrunk, zellij ...etc.,
想像してみよう
%LOCALAPPDATA%\Microsoft\WinGet\Packages\<APPID>_Microsoft.Winget.Source_8wekyb3d8bbwe\ がアプリの数だけ PATH に存在する世界
パスが大量に増える状態って、OS を問わずあんまり健全な状態とは言えませんよね?
そして、 Windows では一定閾値を超えると、ある問題が発生 します。
cmd パス 8K 問題
Windows ではパスが 8192byte 以上は、cmd.exe だけ その先を無視してしまいます。
じゃあ私は PowerShell だから関係ない?
いいえ。
例えば npm における npm-scripts は既定では cmd.exe に依存しています。
そして、実行時に .\node_modules\.bin\ を PATH の 末尾 に追加します。
この時点で 8KB に至っていたらどうなるでしょう?
パス解決が破綻し、結果として……
- Biome が呼べません
- Vitest も呼べません
- もちろん Vinxi もダメです
解決策は?
開発者モードをオン にしましょう
でも私開発者じゃないよ?
WinGet 使うならオン にしましょう
WinGet ちょっとだけなら大丈夫だよね?
大丈夫です……が、インストール数の分鬼長いパスが鎮座してるの、気持ち悪くないですか?
一部例外あり: GUI アプリとかはパスを登録しないものも多いです。
他に %PROGRAMFILES% へインストールしたがるパッケージとかは、問答無用でパスを追記するケースも
すでに PATH が汚れてしまった場合
- 開発者モードを有効にする
- ターミナルを開き直す
- 対象パッケージを再インストール
- PATH から不要な
WinGet\Packages配下を削除
注意点: WinGet\Links が逆にハマるケースもある
開発者モードを有効にすると、WinGet は CLI アプリを %LOCALAPPDATA%\Microsoft\WinGet\Links 配下のリンク経由で起動できるようにします。
しかし、Windows へ SSH 接続して WinGet でインストールしたコマンドを呼ぶと、シンボリックリンクが認識できず、コマンドが失敗します。
この場合、SSH で呼ぶ主要コマンドのみを厳選して、Profile でパスを追加するのがよさそうです。
おしまい!
ご視聴ありがとうございました 🐱
黒音キト@黒猫にゃんにゃんVTuber
