Closed8

winget で環境構築してみた

sys-catsys-cat

きっかけ

最近いつも使っているデスクトップPCのSSDが破損してしまってOS再インストール事象が発生した。
この際、再度環境構築をする際にドライバー以外で普段やっている開発環境(WSLとDocker環境でVSCodeやCursorを使ってGoやRubyを動かす)を用意するためのWin側の環境構築をする訳だけど冪等性を担保してみたいなみたいなことを決意したのでそういったツールを探し始めた。

候補のツール群

あんまりWindowsに詳しいわけではないのでそれとなく探してみると

  • Windows Package Manager : winget
  • Chocolatey

の2つが大きくあるらしい。今回はMS側公式でサポートしている winget でやっていこうと思う。

sys-catsys-cat

winget

https://learn.microsoft.com/ja-jp/windows/package-manager/winget/

winget {command} {option} というコマンドの形式で実行するCLIベースのパッケージマネージャとのこと。パッケージ数は Chocolatey より少ないらしいけどWingetとMSStore側両方のパッケージを取得できるし良いことが多そう。
もちろん winget では取得できないパッケージなどもあると思うのだけどそこはいったん良いとした。

sys-catsys-cat

wingetを試してみる

例えば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
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
sys-catsys-cat

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'

うーん、無理そう。

sys-catsys-cat

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"
}
sys-catsys-cat

Import

Importする場合は以下の方法で可能。

winget import -i C:\File\to\Path\export.json

このコマンドでは すでにインストールされているパッケージで更新があるものは更新がはしる 状態。もし更新を走らせたくない場合は --no-upgrade コマンドを付与すると良い。

ただし、ImportされたJsonには細かいバージョン指定がないので常に最新バージョンがインストールされることになりそう。

sys-catsys-cat

使っていて感じること

Q. これって冪等性担保できてるの?

できては....いないよね。OSのバージョンであったりパッケージのバージョンを固定できる訳ではないので真の意味で冪等性は無い。ふんわり冪等性感。

Q. 特定バージョンを選ぶためにはどうすればよい?

基本的にできない。Electronのように OpenJS.Electron.33 のようなバージョンを任意に指定出来るようなID構造であれば可能だが機能としてはなさそう。

Q. exportしたファイルはどうやって管理するの?

Githubや共有ドライブや自宅内の特定ドライブだったりで所持しつつ定期的にメンテナンスするのがよさそう。

総評

痒い所に手が届かない感は正直感じるけどそれでも非常に便利なツール。
一括インストールであったりバージョン固定ができるとか出来るとより使いやすくなりそうだなぁと感じる。もうちょっと使ってみようかな。

このスクラップは1ヶ月前にクローズされました