winget で環境構築してみた
きっかけ
最近いつも使っているデスクトップPCのSSDが破損してしまってOS再インストール事象が発生した。
この際、再度環境構築をする際にドライバー以外で普段やっている開発環境(WSLとDocker環境でVSCodeやCursorを使ってGoやRubyを動かす)を用意するためのWin側の環境構築をする訳だけど冪等性を担保してみたいなみたいなことを決意したのでそういったツールを探し始めた。
候補のツール群
あんまりWindowsに詳しいわけではないのでそれとなく探してみると
- Windows Package Manager : winget
- Chocolatey
の2つが大きくあるらしい。今回はMS側公式でサポートしている winget でやっていこうと思う。
winget
winget {command} {option} というコマンドの形式で実行するCLIベースのパッケージマネージャとのこと。パッケージ数は Chocolatey より少ないらしいけどWingetとMSStore側両方のパッケージを取得できるし良いことが多そう。
もちろん winget では取得できないパッケージなどもあると思うのだけどそこはいったん良いとした。
wingetを試してみる
search
例えばChromeインストールしたい場合、まずはパッケージがあるかどうかを探すことになると思うのでまずは search コマンドで探してみる。
$ winget search chrome
名前 ID バージョン 一致 ソース
--------------------------------------------------------------------------------------------------------------------------------
Google Chrome Google.Chrome 140.0.7339.208 Moniker: chrome winget
Dichromate Dichromate.Browser 111.0.5563.65 Command: chrome winget
ClaudeToZenn NuitsJp.ClaudeToZenn 0.0.19 Tag: chrome winget
Electron OpenJS.Electron.33 33.4.11 Tag: chrome winget
Electron OpenJS.Electron.34 34.5.8 Tag: chrome winget
Electron OpenJS.Electron.35 35.7.5 Tag: chrome winget
Electron OpenJS.Electron.36 36.9.1 Tag: chrome winget
Electron OpenJS.Electron.37 37.5.0 Tag: chrome winget
Electron OpenJS.Electron.38 38.1.2 Tag: chrome winget
ChromeDriver Chromium.ChromeDriver 140.0.7339.207 winget
Google Chrome Beta Google.Chrome.Beta 141.0.7390.37 winget
Google Chrome Beta (EXE) Google.Chrome.Beta.EXE 141.0.7390.37 winget
Google Chrome Canary Google.Chrome.Canary 142.0.7432.0 winget
Google Chrome Dev Google.Chrome.Dev 142.0.7432.4 winget
Google Chrome Dev (EXE) Google.Chrome.Dev.EXE 142.0.7432.4 winget
Google Chrome (EXE) Google.Chrome.EXE 140.0.7339.208 winget
Chrome Remote Desktop Host Google.ChromeRemoteDesktopHost 141.0.7390.12 winget
ICBCChromeExtension ICBC.ICBCChromeExtension 1.2.0.0 winget
ChromeCacheView NirSoft.ChromeCacheView 2.52 winget
Ginger Chrome Saxo_Broko.GingerChrome 93.0.4529.0 winget
※結果から一部パッケージを削った
install
先頭にある Google Chrome をインストールする場合、名称を指定する場合とIDを指定する場合があるらしい。
$ winget install --id Google.Chrome
見つかりました Google Chrome [Google.Chrome] バージョン 140.0.7339.208
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
ダウンロード中 https://dl.google.com/dl/chrome/install/googlechromestandaloneenterprise64.msi
██████████████████████████████ 131 MB / 131 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました

お、上手くいった。いいね。
install 複数一括にできるの?
sudo apt install -y hoge piyo
のように複数パッケージを一括でインストールできるか?
$ winget install --id Docker.DockerDesktop --id Microsoft.PowerToys
v1.11.430 の Windows パッケージ マネージャー
Copyright (c) Microsoft Corporation. All rights reserved.
引数に指定された回数が許容回数を超えています: 'id'
うーん、無理そう。
Export
Exportは winget export -o {export先のファイルパス、ファイル名} で可能。
winget export -o C:\File\to\path\export.json
exportされたファイルの中身は以下のような形式になる。
{
"$schema" : "https://aka.ms/winget-packages.schema.2.0.json",
"CreationDate" : "2025-09-XXTXX:00:50.377-00:00",
"Sources" :
[
{
"Packages" :
[
{
"PackageIdentifier" : "インストールされたパッケージのID"
},
{
"PackageIdentifier" : "Docker.DockerDesktop"
},
{
"PackageIdentifier" : "Google.Chrome"
},.....
],
"SourceDetails" :
{
"Argument" : "------------",
"Identifier" : "------------",
"Name" : "winget",
"Type" : "Microsoft.PreIndexed.Package"
}
}
],
"WinGetVersion" : "version id"
}
Import
Importする場合は以下の方法で可能。
winget import -i C:\File\to\Path\export.json
このコマンドでは すでにインストールされているパッケージで更新があるものは更新がはしる 状態。もし更新を走らせたくない場合は --no-upgrade コマンドを付与すると良い。
ただし、ImportされたJsonには細かいバージョン指定がないので常に最新バージョンがインストールされることになりそう。
使っていて感じること
Q. これって冪等性担保できてるの?
できては....いないよね。OSのバージョンであったりパッケージのバージョンを固定できる訳ではないので真の意味で冪等性は無い。ふんわり冪等性感。
Q. 特定バージョンを選ぶためにはどうすればよい?
基本的にできない。Electronのように OpenJS.Electron.33 のようなバージョンを任意に指定出来るようなID構造であれば可能だが機能としてはなさそう。
Q. exportしたファイルはどうやって管理するの?
Githubや共有ドライブや自宅内の特定ドライブだったりで所持しつつ定期的にメンテナンスするのがよさそう。
総評
痒い所に手が届かない感は正直感じるけどそれでも非常に便利なツール。
一括インストールであったりバージョン固定ができるとか出来るとより使いやすくなりそうだなぁと感じる。もうちょっと使ってみようかな。