winget configurationを使ってWindows開発環境を一瞬で構築する

## はじめに

[前回の記事](https://qiita.com/ootakazuhiko/items/18bc6e4d60b4f5b9d6f9)ではWingetの基本的な使い方についてまとめました。本記事では、最近追加された「winget configuration」について紹介します。
この機能を活用すれば、開発環境のセットアップを効率化できます。

みなさんこんにちは。新しいPCをセットアップする際や、チームメンバーの開発環境を統一する時に、面倒な作業の連続で時間を無駄にした経験はないでしょうか。

この記事では、単なるアプリインストールツールとしてのwingetの使い方を超えて、**開発環境の完全自動化**を実現する方法を解説します。DevContainerのようなコンテナ技術を使わなくても、Windowsネイティブで開発環境の再現性を確保する新しいアプローチをご紹介します。

## wingetの進化 パッケージマネージャーから環境構築ツールへ

wingetは2020年にプレビュー版がリリースされてから着実に進化し、2023年に「1.6」がリリースされた際に「winget configuration」機能が安定版として追加されました。これはMicrosoft Build 2023で発表された機能で、開発環境のセットアップを構成ファイル（*.dsc.yaml）を使って自動化できるようになりました。

「WinGet Configuration」は、構成ファイル（*.dsc.yaml）を元に開発ツールやフレームワーク、パッケージ、アプリなどをセットアップする仕組みです。これまで数時間、数日かかっていた複雑な作業を、コマンドを一発実行するだけで無人で完了できる信頼性の高さが特徴です。

この機能の意義は非常に大きく、Visual Studio Codeのような複雑な開発環境も設定ファイル一つで構築できるようになりました。

```mermaid
graph TD
    A[従来のパッケージ管理] -->|進化| B[winget basic]
    B -->|進化| C[winget configuration]
    A -->|機能| D[パッケージインストール]
    B -->|機能| D
    B -->|機能| E[バージョン管理]
    C -->|機能| D
    C -->|機能| E
    C -->|機能| F[設定の自動化]
    C -->|機能| G[依存関係管理]
    
    style C fill:#a2e8a2,stroke:#00aa00
    style F fill:#a2d6e8,stroke:#0088cc
    style G fill:#a2d6e8,stroke:#0088cc
```

## 従来のwinget exportとimportの限界

従来のwinget export/importでもある程度の環境移行は可能でしたが、いくつかの課題がありました。

1. インストールされているアプリの単純なリストしか扱えない
2. バージョン指定が煩雑
3. アプリの設定や構成までは管理できない
4. 依存関係の管理が完全ではない

Wingetでは、exportサブコマンドを使うことで、そのマシンにインストールされているアプリケーションのうち、Wingetでインストール可能なプログラムのリストをJSON形式で出力することができます。しかし、引っ越し元でexportする場合にバージョン情報を付けること、importするときにバージョン情報に従うか無視するかの選択肢しかありません。

また、exportで出力されるJSONファイルには不要なプログラムも含まれてしまう問題もあります。Wingetは、export時には依存関係で入ったプログラムなのかどうかを区別していないため、たとえば、C/C++のランタイムはすべて見つけ出し、wingetでインストール可能なものはexportコマンドで出力します。

```mermaid
graph LR
    subgraph "従来のexport/import"
        A1[winget export] --> B1[JSON形式]
        B1 --> C1[winget import]
        C1 --> D1[アプリケーションのみ]
    end
    
    subgraph "新しいconfiguration"
        A2[構成ファイル作成] --> B2[YAML形式]
        B2 --> C2[winget configure]
        C2 --> D2[アプリケーション]
        C2 --> E2[設定]
        C2 --> F2[依存関係]
    end

    style B2 fill:#a2e8a2,stroke:#00aa00
    style E2 fill:#a2d6e8,stroke:#0088cc
    style F2 fill:#a2d6e8,stroke:#0088cc
```

## winget configurationの革新性

winget configurationは、こうした課題を解決し、より高度な環境構築を実現します。

### 主な特徴

1. **宣言的な構成管理**: YAMLファイルで環境を定義
2. **アプリケーションの自動インストール**: パッケージの一括インストール
3. **構成の自動適用**: アプリケーションのインストールだけでなく、設定も自動化
4. **アイドルポテンシャル**: 実行中に他の作業ができる（無人インストールが可能）
5. **再現性の確保**: 同じ設定ファイルから常に同じ環境を構築可能
6. **バージョン管理の容易さ**: 構成ファイルをGitで管理可能

特に注目すべきは、Microsoft公式のプロジェクトで使用されている点です。たとえば、Visual Studio CodeやPowerToysのソースコードをコンパイルする環境を構築するには、GitHubで公開されている「configuration.dsc.yaml」を利用できます。この技術は「Dev Home」でも活用されており、アプリ開発環境を数クリックで構築できる利便性があります。

```mermaid
graph TD
    A[パッケージ管理] -->|統合| B[環境構成]
    B -->|結果| C[開発効率化]
    A --> D[アプリインストール]
    B --> E[設定自動化]
    D --> C
    E --> C
    
    style C fill:#a2e8a2,stroke:#00aa00
    style E fill:#a2d6e8,stroke:#0088cc
```

## 実践的な活用法：チーム開発環境の標準化

以下に、winget configurationを使った実践的な活用例を示します。

### 1. 基本的な構成ファイルの作成

まず、以下のような最小限の`dev-environment.dsc.yaml`ファイルを作成します：

```yaml
# dev-environment.dsc.yaml
properties:
  resources:
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: VSCode
      properties:
        id: Microsoft.VisualStudioCode
        source: winget
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Git
      properties:
        id: Git.Git
        source: winget
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Node
      properties:
        id: OpenJS.NodeJS.LTS
        source: winget
```

### 2. 構成の適用方法

上記のファイルを作成したら、以下のコマンドで環境を構築します。

```powershell
winget configure dev-environment.dsc.yaml
```

このコマンド一発で、VSCode、Git、Node.jsがインストールされ、基本的な開発環境が整います。

```mermaid
flowchart TD
    A[YAML構成ファイル作成] --> B[ファイル検証]
    B --> C{エラー?}
    C -->|Yes| D[修正]
    D --> B
    C -->|No| E[winget configure実行]
    E --> F[依存関係確認]
    F --> G[ソース検索]
    G --> H[パッケージダウンロード]
    H --> I[インストール]
    I --> J[設定適用]
    J --> K[完了]
    
    style A fill:#f9d6a2,stroke:#e67e00
    style E fill:#a2e8a2,stroke:#00aa00
    style K fill:#a2d6e8,stroke:#0088cc
```

### 3. より高度な構成例

以下は、フロントエンド開発チーム向けの構成ファイル例です。

```yaml
# frontend-team.dsc.yaml
properties:
  resources:
    # 開発ツール
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: VSCode
      properties:
        id: Microsoft.VisualStudioCode
        source: winget
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Git
      properties:
        id: Git.Git
        source: winget
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Node
      properties:
        id: OpenJS.NodeJS.LTS
        source: winget
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Chrome
      properties:
        id: Google.Chrome
        source: winget
    
    # VSCode拡張機能設定
    - resource: Microsoft.VisualStudio.Code.DSC/Extension
      dependsOn:
        - VSCode
      id: ESLint
      properties:
        extensionId: dbaeumer.vscode-eslint
    - resource: Microsoft.VisualStudio.Code.DSC/Extension
      dependsOn:
        - VSCode
      id: Prettier
      properties:
        extensionId: esbenp.prettier-vscode
    
    # Git設定
    - resource: Microsoft.Windows.DSC/PowerShellScript
      dependsOn:
        - Git
      id: GitConfig
      properties:
        scriptContent: |
          git config --global core.autocrlf true
          git config --global pull.rebase false
```

```mermaid
graph TD
    A[VSCode] --> B[ESLint拡張]
    A --> C[Prettier拡張]
    E[Git] --> F[Git設定]
    
    style A fill:#f9d6a2,stroke:#e67e00
    style E fill:#a2d6e8,stroke:#0088cc
```

## 実際の業務での活用シナリオ

### 1. 新メンバーオンボーディングの効率化

新しいチームメンバーが入社した際、以下のようなプロセスでスムーズなオンボーディングを実現できます：

1. チームの標準構成を`team-env.dsc.yaml`として管理
2. 新メンバーのPCセットアップ時に`winget configure team-env.dsc.yaml`を実行
3. 開発者は環境構築を待つ間に他のオンボーディング作業に集中できる

### 2. プロジェクト固有の開発環境

プロジェクトごとに異なる開発環境が必要な場合も対応可能です。

1. プロジェクトリポジトリのルートに`.devconfig/project.dsc.yaml`を配置
2. READMEに環境セットアップ手順として`winget configure .devconfig/project.dsc.yaml`を記載
3. 開発者がプロジェクトに参加する際、コマンド一発で環境構築

### 3. CI/CD環境の標準化

テスト用VMやCI/CD環境でも同じ構成ファイルを使用することで、「開発環境では動くのに本番では動かない」問題を軽減できます。

```mermaid
graph TD
    subgraph "シナリオ1: 新メンバーオンボーディング"
        A1[チーム標準YAML] --> B1[配布]
        B1 --> C1[一括インストール]
        C1 --> D1[即時環境統一]
    end
    
    subgraph "シナリオ2: プロジェクト固有環境"
        A2[プロジェクトYAML] --> B2[リポジトリ管理]
        B2 --> C2[clone後に実行]
        C2 --> D2[プロジェクト環境構築]
    end
    
    subgraph "シナリオ3: CI/CD環境構築"
        A3[環境定義YAML] --> B3[CI/CDパイプライン]
        B3 --> C3[自動構築]
        C3 --> D3[テスト環境一貫性]
    end
    
    style D1 fill:#a2e8a2,stroke:#00aa00
    style D2 fill:#a2d6e8,stroke:#0088cc
    style D3 fill:#f9d6a2,stroke:#e67e00
```

## 既存のexport/importコマンドとの連携

既存の環境から新しい構成ファイルを作成するには、まず従来のexportコマンドで出力したJSONを参考にすることも可能です。

```powershell
# 既存環境の出力
winget export -o current-apps.json --include-versions

# 出力されたJSONを参考に新しい構成ファイルを作成
# (現時点では自動変換機能はないため手動で作成が必要)
```

なお、GitHub上では自動変換を可能にする機能が検討されています。これにより、JSONファイルからYAML構成ファイルへの変換が容易になる可能性があります。

```mermaid
flowchart LR
    A[既存環境] --> B[winget export]
    B --> C[apps.json]
    C -->|現状: 手動変換| D[構成ファイル]
    C -->|将来: 自動変換| E[configuration.dsc.yaml]
    D --> F[winget configure]
    E --> F
    F --> G[新環境]
    
    style C fill:#f9d6a2,stroke:#e67e00
    style E fill:#a2e8a2,stroke:#00aa00
    style G fill:#a2d6e8,stroke:#0088cc
```

## セキュリティと注意点

wingetのパッケージは基本的に信頼性が高いものの、実務での利用にあたっては以下の点に注意が必要です。

Wingetのリポジトリは、GitHubにて管理されていますが、ここで管理されている情報（マニフェスト）は、どのソフトウェアのインストーラーがどこのURLにあるかという情報です。このマニフェストは誰でもプルリクエストを送ることができます（そのソフトウェアに関係のない第三者でも）。

セキュリティを重視する場合は、以下の対策を検討しましょう。

1. 社内プライベートリポジトリの構築
2. インストール前の確認プロンプトを有効にする
3. 特に重要なアプリケーションは公式サイトからの手動インストールを検討

```mermaid
graph TD
    A[セキュリティリスク] --> B[対策1: プライベートリポジトリ]
    A --> C[対策2: 確認プロンプト]
    A --> D[対策3: 手動インストール併用]
    
    B -->|メリット| E[完全な制御]
    B -->|デメリット| F[運用コスト増]
    
    C -->|メリット| G[低コストで安全]
    C -->|デメリット| H[完全自動化不可]
    
    D -->|メリット| I[重要アプリを保護]
    D -->|デメリット| J[一部手動作業必要]
    
    style E fill:#a2e8a2,stroke:#00aa00
    style G fill:#a2d6e8,stroke:#0088cc
    style I fill:#f9d6a2,stroke:#e67e00
```

## 最新バージョン情報とアップデート方法

2025年5月現在、wingetの最新バージョンは1.8.1911となっています。インストールや更新は以下の方法で行えます。

winget コマンドのバージョンは、`winget -v` コマンドで確認可能です。現時点では、Microsoft.DesktopAppInstaller のバージョン 1.8.1911 が最新版として公開されていますので、こちらのバージョンをダウンロードする手順をご紹介します。

PowerShellから以下のコマンドで最新版をインストールできます。

```powershell
# 最新バージョンのダウンロードとインストール
Invoke-WebRequest -Uri https://github.com/microsoft/winget-cli/releases/download/v1.8.1911/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle -OutFile winget.msixbundle -UseBasicParsing
Add-AppxPackage -Path winget.msixbundle
Remove-Item winget.msixbundle
```

```mermaid
timeline
    title wingetの主要バージョンと機能
    section 初期
        2020 : プレビュー版リリース : 基本的なパッケージ管理
    section 安定化
        2021 : v1.0 : 安定版リリース
        2022 : v1.3 : ポータブルアプリサポート
    section 機能拡張
        2023 : v1.6 : winget configuration機能
        2024 : v1.7 : 構成機能の拡張
        2025 : v1.8.1911 : 最新版
```

## 応用例：特定技術スタック向けの構成ファイル

以下に、いくつかの主要な技術スタック向けの構成ファイル例を示します。これらはチーム内で共有し、カスタマイズして使用できます。

### React開発環境

```yaml
# react-dev.dsc.yaml
properties:
  resources:
    # 基本開発ツール
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: VSCode
      properties:
        id: Microsoft.VisualStudioCode
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Git
      properties:
        id: Git.Git
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Node
      properties:
        id: OpenJS.NodeJS.LTS
    
    # ブラウザ
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Chrome
      properties:
        id: Google.Chrome
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Edge
      properties:
        id: Microsoft.Edge
    
    # VSCode拡張機能
    - resource: Microsoft.VisualStudio.Code.DSC/Extension
      dependsOn:
        - VSCode
      id: ESLint
      properties:
        extensionId: dbaeumer.vscode-eslint
    - resource: Microsoft.VisualStudio.Code.DSC/Extension
      dependsOn:
        - VSCode
      id: Prettier
      properties:
        extensionId: esbenp.prettier-vscode
    - resource: Microsoft.VisualStudio.Code.DSC/Extension
      dependsOn:
        - VSCode
      id: ReactSnippets
      properties:
        extensionId: dsznajder.es7-react-js-snippets
    
    # React開発環境のセットアップ
    - resource: Microsoft.Windows.DSC/PowerShellScript
      dependsOn:
        - Node
      id: SetupCRA
      properties:
        scriptContent: |
          npm install -g create-react-app
          npm install -g yarn
```

### .NET開発環境

```yaml
# dotnet-dev.dsc.yaml
properties:
  resources:
    # 基本開発ツール
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: VSCode
      properties:
        id: Microsoft.VisualStudioCode
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: VisualStudio
      properties:
        id: Microsoft.VisualStudio.2022.Community
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Git
      properties:
        id: Git.Git
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: DotNet
      properties:
        id: Microsoft.DotNet.SDK.8
    
    # VSCode拡張機能
    - resource: Microsoft.VisualStudio.Code.DSC/Extension
      dependsOn:
        - VSCode
      id: CSharp
      properties:
        extensionId: ms-dotnettools.csharp
    
    # 開発ツール
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: AzureDataStudio
      properties:
        id: Microsoft.AzureDataStudio
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: SSMS
      properties:
        id: Microsoft.SQLServerManagementStudio
```

```mermaid
graph LR
    subgraph "React環境"
        A1[VSCode] --> B1[ESLint/Prettier]
        C1[Node.js] --> D1[npm/yarn]
        E1[ブラウザ] --> F1[Chrome/Edge]
    end
    
    subgraph ".NET環境"
        A2[Visual Studio] --> B2[.NET SDK]
        C2[VSCode] --> D2[C#拡張]
        E2[データツール] --> F2[SSMS/Azure Data Studio]
    end
    
    style A1 fill:#a2e8a2,stroke:#00aa00
    style A2 fill:#a2d6e8,stroke:#0088cc
    style C1 fill:#f9d6a2,stroke:#e67e00
    style E2 fill:#f9d6a2,stroke:#e67e00
```

## まとめと今後の展望

winget configurationは、Windows環境での開発セットアップの自動化において革新的な進化を遂げました。DevContainerのようなコンテナ技術に頼らなくても、ネイティブなWindows環境で再現性の高い開発環境を構築できるようになっています。

今後の展望としては

1. より多くの公式構成テンプレートの登録
2. VSCode拡張機能やDevContainerとの連携強化
3. サードパーティアプリの設定自動化の拡充

Windows開発環境の構築自動化を検討している方は、ぜひwinget configurationを試してみてください。一度構成ファイルを作成すれば、何度でも同じ環境を再現でき、チーム全体の生産性向上につながります。

```mermaid
graph TD
    A[winget configuration] --> B[構成テンプレート拡充]
    A --> C[連携強化]
    A --> D[機能拡張]
    A --> E[ツール統合]
    
    B --> B1[言語別テンプレート]
    B --> B2[業界別テンプレート]
    B --> B3[役割別テンプレート]
    
    C --> C1[VSCode拡張連携]
    C --> C2[DevContainer互換]
    C --> C3[GitHub Actions連携]
    
    D --> D1[サードパーティアプリ設定]
    D --> D2[自動更新ポリシー]
    D --> D3[高度な依存関係管理]
    
    E --> E1[自動変換機能]
    E --> E2[GUI管理ツール]
    E --> E3[診断・修復機能]
    
    style A fill:#f96,stroke:#333
    style B fill:#9cf,stroke:#333
    style C fill:#9cf,stroke:#333
    style D fill:#9cf,stroke:#333
    style E fill:#9cf,stroke:#333
```

## 参考リンク

- [Microsoft公式ドキュメント - winget configuration](https://learn.microsoft.com/ja-jp/windows/package-manager/winget/configure)
- [GitHub - microsoft/winget-cli](https://github.com/microsoft/winget-cli)
- [Windows Package Manager 1.6 リリースノート](https://github.com/microsoft/winget-cli/releases)

---

この記事が皆さんの開発環境構築の効率化に役立てば幸いです。質問やフィードバックがあれば、コメント欄にお寄せください。