SandboxでWindowsのパッケージマネージャ(winget)を使ってみる

# Windowsのパッケージマネージャ(winget)を使ってみる

WindowsにもLinuxのaptやyumといったものと似たようなコマンドラインで実行できるパッケージマネージャが実装されていました。


:::note info
前の記述のままでは動かなくなっていた(2023/06/04)ので、修正しました。
・Microsoft.UI.Xamlのインストールを追記。
・Pythonパッケージ名を修正

:::
:::note info
また、前の記述のままでは動かなくなっていた(2024/04/15時点)ので、修正しました。
・Microsoftのサイトのリンクに変更

:::

## winget
wingetの使い方は、他のパッケージマネージャツールとほとんど変わらないようです。
searchで検索して、installでインストール、です。
https://docs.microsoft.com/ja-jp/windows/package-manager/


## Sandboxでのwinget
実際に使える場面としては、Sandboxで環境を作る際にバッチファイルで作成しやすいとかですね。
前の記事（[Windows Sandbox設定](https://qiita.com/tkhr68000/items/97eb1c1730e6a58570d1)）では、インストーラをダウンロードしてオプション指定してサイレントインストールをしていました。
wingetに置き換えるとスマートに記述できると思うので作成しようとしたのですが、Sandboxにはwingetはインストールされていません。
Sandboxで使うためには、wingetをインストールしてから、他のアプリをwingetでインストールという形になります。
また、VCLibsも必要とのことなので、それもインストールが必要となります。

### wingetのインストール

VCLibsのパッケージのURLは以下のページから取得します。
[C++ ランタイム フレームワーク パッケージのデスクトップ ブリッジ](https://docs.microsoft.com/ja-jp/troubleshoot/developer/visualstudio/cpp/libraries/c-runtime-packages-desktop-bridge)

以下のページからPackage ManagerのパッケージのURLを取得します。
https://github.com/microsoft/winget-cli/releases/
Windows 10 (1809+).同等のパッケージが現時点(2022/02/27)のLatestなので、ここからURLを取得します。


:::note info
以前の記述だけでは、wingetインストールでエラーとなります。
フレームワーク"Microsoft.UI.Xaml.2.7"が必要なようです。
:::

実際のコマンドは以下のようになります。

:::note info
Microsoftのサイトのリンクに変更
:::

https://learn.microsoft.com/ja-jp/windows/package-manager/winget/#install-winget-on-windows-sandbox

### wingetでの環境構築

wingetをコマンドラインで実行する場合には、以下のようなコマンドになります。
```Console
winget install Microsoft.VisualStudioCode
winget install OpenJS.NodeJS.LTS
winget install Python.Python.3.8
```

Jsonファイルでまとめてimportもできます。
詳細は公式[import コマンド (winget)](https://docs.microsoft.com/ja-jp/windows/package-manager/winget/import)を参照して下さい。

インストール対象のアプリに関しては、ホスト側のWindowsのインストールパッケージを参考にしたいため、一旦、チェックします。
以下のコマンドでインストール済みパッケージがファイルに出力されます。
```Console
winget export export.json
```

import時のコマンドは以下のようになります。
```Console
winget import export.json
```


## Sandboxファイル作成
これまでの情報を元にSnadbox構築ファイルを作っていきます。
定番のソフトと開発用も含めて以下のパッケージをインストール対象としたSndbox起動用ファイルを作成します。
・VSCode
・Node.js
・Python
・Git
・7zip

パッケージの指定方法は、exportしたファイルを参考にしてjsonファイルを作成します。

### packages.json
まずは、import対象ファイルをJSONファイルにまとめます。

```JSON:packages.json
{
    "$schema": "https://aka.ms/winget-packages.schema.2.0.json",
    "Sources": [
        {
            "Packages": [
                {
                    "PackageIdentifier": "Microsoft.VisualStudioCode"
                },
                {
                    "PackageIdentifier": "OpenJS.NodeJS.LTS"
                },
                {
                    "PackageIdentifier" : "Python.Python.3.8"
                },
                {
                    "PackageIdentifier": "Git.Git"
                },
                {
                    "PackageIdentifier": "7zip.7zip.Alpha.msi"
                }
            ],
            "SourceDetails": {
                "Argument": "https://winget.azureedge.net/cache",
                "Identifier": "Microsoft.Winget.Source_8wekyb3d8bbwe",
                "Name": "winget",
                "Type": "Microsoft.PreIndexed.Package"
            }
        }
    ]
}
```
### setup.ps1
環境設定用のPowerShellスクリプトを作成します。

```PowerShell:setup.ps1
# wingetインストール
$progressPreference = 'silentlyContinue'
Write-Information "Downloading WinGet and its dependencies..."
Invoke-WebRequest -Uri https://aka.ms/getwinget -OutFile Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle
Invoke-WebRequest -Uri https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx -OutFile Microsoft.VCLibs.x64.14.00.Desktop.appx
Invoke-WebRequest -Uri https://github.com/microsoft/microsoft-ui-xaml/releases/download/v2.8.6/Microsoft.UI.Xaml.2.8.x64.appx -OutFile Microsoft.UI.Xaml.2.8.x64.appx
Add-AppxPackage Microsoft.VCLibs.x64.14.00.Desktop.appx
Add-AppxPackage Microsoft.UI.Xaml.2.8.x64.appx
Add-AppxPackage Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle

# wingetでimport
cd C:\Users\WDAGUtilityAccount\Desktop\SandboxScripts\
winget import packages.json
```

### setup.cmd
環境設定用のPowerShellスクリプトを呼び出すスクリプトを作成します。

```Batchfile:setup.cmd
"%SystemRoot%\System32\\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command Start-Process -wait 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' C:\Users\WDAGUtilityAccount\Desktop\SandboxScripts\setup.ps1"
```

### setup.wsb
Sandbox起動用ファイルを作成します。

```xml:setup.wsb
<Configuration>
  <MappedFolders>
    <MappedFolder>
      <HostFolder>C:\SandboxScripts</HostFolder>
      <ReadOnly>true</ReadOnly>
    </MappedFolder>
  </MappedFolders>
  <LogonCommand>
    <Command>C:\Users\WDAGUtilityAccount\Desktop\SandboxScripts\setup.cmd</Command>
  </LogonCommand>
</Configuration>
```

上記の設定は、packages.json/setup.ps1/setup.cmdはC:\SandboxScriptsに格納されている前提です。

作成したsetup.wsbファイルをダブルクリックでSandboxが起動され、環境設定まで実行されます。