リポジトリ直下をVS Codeで開いたとき、WinAppコマンドが対象アプリではなく別のサブプロジェクトやワークスペースルートを選んでしまう場合は、WinApp VS Code拡張をv0.2以降へ更新してください。それでも候補が多い、または特定のアプリだけを対象にしたい場合は、.vscode/settings.jsonのwinapp.appDirectoriesに対象ディレクトリを列挙するのが確実です。
Microsoftはv0.2でWinAppコマンドをワークスペース対応にし、サブフォルダー内のアプリを検出できるようにしました。公式上、この問題は修正済みです。ただし、自動検出には「ワークスペースルートを優先する」「検出結果が1件なら自動選択する」といったルールがあります。そのため、モノレポではwinapp.appDirectoriesで対象を明示した方が、誤操作を防ぎやすくなります。(Microsoft Dev Blogs)
結論:v0.2へ更新し、必要なら対象ディレクトリを固定する
状況ごとの対応は次のとおりです。
| 状況 | 推奨する対応 |
|---|---|
| WinApp拡張がv0.1以前 | v0.2以降へ更新する |
| サブフォルダーにアプリが1つだけある | まず自動検出を使う |
| モノレポ内に複数のアプリがある | winapp.appDirectoriesで対象を列挙する |
| ルートにも検出可能なプロジェクトがある | winapp.appDirectoriesを設定してルート優先を上書きする |
| 毎回同じ1アプリだけを操作する | 対象を1件だけ設定して自動選択させる |
| 操作時に対象アプリを選びたい | 対象を複数件設定し、QuickPickから選択する |
複数プロジェクトを含むモノレポでは、次のように設定します。
{
"winapp.appDirectories": [
"apps/desktop-client",
"apps/admin-shell"
]
}
パスは、VS Codeで開いているワークスペースルートからの相対パスです。設定が1件ならそのディレクトリが自動的に選択され、複数件なら設定した候補だけが選択画面に表示されます。(GitHub)
なぜモノレポで別プロジェクトが選ばれるのか
v0.1はVS Codeで開いたディレクトリをそのまま使っていた
WinApp VS Code拡張のv0.1では、WinAppコマンドがVS Codeで開いている現在のディレクトリから実行されていました。
たとえば、次の構成でリポジトリ直下を開いていたとします。
sample-repository/
├─ apps/
│ ├─ desktop-client/
│ │ └─ DesktopClient.csproj
│ └─ admin-shell/
│ └─ package.json
├─ packages/
├─ README.md
└─ package.json
本来のWindowsアプリがapps/desktop-clientにあっても、v0.1ではsample-repositoryがコマンドの実行場所になります。そのため、利用者はWinAppコマンドを実行するたびに、対象アプリのフォルダーをVS Codeで開き直す必要がありました。
v0.2では、この挙動がワークスペース対応に変更されています。リポジトリ直下を開いたまま、拡張機能がサブフォルダー内の対応プロジェクトを検索します。検出されたプロジェクトが1つなら自動選択し、複数なら選択画面を表示します。(Microsoft Dev Blogs)
v0.2でもルートプロジェクトが優先される
v0.2以降の対象ディレクトリ決定には、次の優先順位があります。
winapp.appDirectoriesで指定したディレクトリ- ワークスペースルートにある対応プロジェクト
- ワークスペース内を検索して見つかったプロジェクト
つまり、ワークスペースルートがWinApp対応プロジェクトとして認識されると、サブフォルダーの検索より先にルートが選ばれます。これは仕様上の優先順位であり、不具合とは限りません。(GitHub)
たとえば、モノレポルートにElectronを依存関係として含むpackage.jsonがあり、実際に操作したいアプリがapps/clientにある場合、ルートが先にプロジェクトとして認識される可能性があります。
このような構成では、自動検出だけに任せず、次のように対象を明示します。
{
"winapp.appDirectories": [
"apps/client"
]
}
winapp.appDirectoriesは最優先で評価されるため、ワークスペースルートが対応プロジェクトとして認識されていても、指定したサブフォルダーを対象にできます。
winapp.appDirectoriesの設定手順
WinApp拡張をv0.2以降へ更新する
VS Codeで次の手順を実行します。
Ctrl+Shift+Xで拡張機能画面を開く- 「WinApp」を検索する
- MicrosoftのWinApp拡張を開く
- 更新ボタンが表示されている場合は更新する
- 拡張機能のバージョンがv0.2以降であることを確認する
コマンドラインからインストールする場合は、次の拡張機能IDを使用できます。
code --install-extension Microsoft-WinAppCLI.winapp
v0.2の公式要件はWindows 10以降、Visual Studio Code 1.109.0以降です。拡張機能を更新できない場合は、先にVS Code本体を更新してください。(Microsoft Dev Blogs)
.vscode/settings.jsonを作成する
VS Codeで開いているリポジトリ直下に、.vscodeフォルダーを作成します。その中にsettings.jsonを作成してください。
sample-repository/
├─ .vscode/
│ └─ settings.json
├─ apps/
│ ├─ desktop-client/
│ └─ admin-shell/
└─ packages/
すでに.vscode/settings.jsonがある場合は、既存の設定を消さずにwinapp.appDirectoriesを追加します。
1つのアプリを自動選択する設定
常にapps/desktop-clientを操作する場合は、1件だけ指定します。
{
"winapp.appDirectories": [
"apps/desktop-client"
]
}
設定が1件の場合、プロジェクト選択画面は表示されません。対象ディレクトリが自動的に使われます。
毎回同じWindowsアプリに対して、マニフェスト生成やパッケージ復元などを行う環境に向いています。
複数アプリから選択する設定
モノレポ内に複数のWindowsアプリがある場合は、対象にしたいディレクトリをすべて列挙します。
{
"winapp.appDirectories": [
"apps/desktop-client",
"apps/admin-shell",
"tools/package-viewer"
]
}
WinAppコマンドを実行すると、指定した3件だけがQuickPickに表示されます。
自動検索で見つかるテスト用プロジェクト、サンプルアプリ、検証用ツールなどを候補から除外できるため、実務ではこの設定が安全です。
設定を反映して動作を確認する
通常、ワークスペース設定は保存後に反映されます。選択結果が変わらない場合は、コマンドパレットから次を実行してください。
Developer: Reload Window
動作確認では、プロジェクトに変更を加えるコマンドよりも、まずWinApp: Get WinApp Pathなどの確認系コマンドを実行する方が安全です。
複数のディレクトリを設定した場合は、QuickPickに指定したディレクトリだけが表示されることを確認します。1件だけ設定した場合は、選択画面を表示せず、そのディレクトリを対象にコマンドが実行されます。
設定の有無による動作の違い
winapp.appDirectoriesの設定状態によって、WinApp拡張の挙動は変わります。
| 設定状態 | 動作 |
|---|---|
| 1件指定 | 指定したディレクトリを自動選択 |
| 複数件指定 | 指定したディレクトリだけをQuickPickに表示 |
| 設定なし | ワークスペースルートとサブフォルダーを自動検出 |
| 空配列を指定 | 設定なしと同様に自動検出 |
| ルートに対応プロジェクトがある | ルートを優先して実行 |
| ルートになく、検出結果が1件 | 検出したプロジェクトを自動選択 |
| ルートになく、検出結果が複数 | QuickPickで選択 |
| プロジェクトが見つからない | ワークスペースルートにフォールバック |
重要なのは、次の設定では自動検出を停止できないことです。
{
"winapp.appDirectories": []
}
空配列は「対象なし」ではなく、「明示設定なし」として扱われます。自動検索を使わず対象を固定したい場合は、少なくとも1件のディレクトリを指定してください。(GitHub)
winapp.appDirectoriesが適用されるコマンド
winapp.appDirectoriesは、プロジェクトの作業ディレクトリを必要とするWinAppコマンドに適用されます。
公式ドキュメントでは、次のようなコマンドが対象として挙げられています。
WinApp: Initialize ProjectWinApp: Restore PackagesWinApp: Update PackagesWinApp: Generate ManifestWinApp: Update Manifest AssetsWinApp: Add Manifest Execution AliasWinApp: Generate CertificateWinApp: Unregister PackageWinApp: Get WinApp Path
一方、ファイルや入力フォルダーを利用者が直接選択するコマンドは、winapp.appDirectoriesによるプロジェクト検出を使いません。
| コマンド例 | 対象の決まり方 |
|---|---|
| Initialize Project | winapp.appDirectoriesまたは自動検出 |
| Restore Packages | winapp.appDirectoriesまたは自動検出 |
| Generate Manifest | winapp.appDirectoriesまたは自動検出 |
| Run Application | 選択したファイルやフォルダー |
| Create MSIX Package | 指定した入力フォルダー |
| Sign Package | 選択したパッケージ |
| Install Certificate | 選択した証明書 |
| Certificate Info | 選択した証明書 |
「設定したのにMSIX作成時の入力フォルダーが変わらない」といった場合は、不具合ではなく、コマンドが明示的な入力対象を使う種類である可能性があります。([Visual Studio Marketplace][4])
自動検出と明示設定はどちらを使うべきか
v0.2以降では自動検出が利用できますが、すべてのモノレポで自動検出が最適とは限りません。
| リポジトリ構成 | 適した方法 |
|---|---|
| 対応アプリが1つだけ | 自動検出 |
| 対応アプリが複数ある | winapp.appDirectories |
| サンプルやテストアプリが多い | winapp.appDirectories |
| ルートも対応プロジェクトとして認識される | winapp.appDirectories |
| アプリの追加や削除が頻繁 | 自動検出 |
| チーム全員で同じ対象を使う | .vscode/settings.jsonを共有 |
| 開発者ごとに担当アプリが異なる | 複数候補を設定してQuickPickを使う |
実務上の判断基準は、自動検出の便利さより、誤ったプロジェクトに変更を加えるリスクが大きいかです。
マニフェスト生成、アセット更新、証明書作成などはファイルを生成・変更する可能性があります。複数アプリを含むリポジトリでは、対象を明示しておく方が安全です。
自動検出が別プロジェクトを候補にする仕組み
WinApp拡張は、ディレクトリ内の代表的なファイルを使って対応プロジェクトを判定します。現在の実装では、主に次の種類が検出対象です。
| プロジェクト種別 | 主な検出要素 |
|---|---|
| .NET | 実行可能プロジェクトの.csproj |
| Electron | Electron依存関係を含むpackage.json |
| Tauri | tauri.conf.json |
| Flutter | pubspec.yaml |
| Rust | Cargo.toml |
| C++ | CMakeLists.txt |
モノレポ内に複数のCargo.tomlやCMakeLists.txtがある場合、WinAppの対象として意図していないツールやサンプルも候補になる可能性があります。
また、自動検索で表示されるプロジェクト数には上限があり、10件に達すると検索が停止します。大規模なモノレポで目的のアプリが候補に表示されない場合も、winapp.appDirectoriesで直接指定するのが確実です。(GitHub)
設定時に間違えやすいポイント
プロジェクトファイルではなくディレクトリを指定する
次のように.csprojやpackage.jsonまで書くのは適切ではありません。
{
"winapp.appDirectories": [
"apps/desktop-client/DesktopClient.csproj"
]
}
指定するのは、プロジェクトファイルを含むディレクトリです。
{
"winapp.appDirectories": [
"apps/desktop-client"
]
}
.vscodeフォルダーからの相対パスではない
基準となるのは、.vscode/settings.jsonの場所ではなく、VS Codeのワークスペースルートです。
次の構成であれば、指定値は../apps/desktop-clientではありません。
sample-repository/
├─ .vscode/
│ └─ settings.json
└─ apps/
└─ desktop-client/
正しい設定は次のとおりです。
{
"winapp.appDirectories": [
"apps/desktop-client"
]
}
絶対パスやワークスペース外を指定しない
winapp.appDirectoriesはワークスペース内の相対パスを指定する設定です。
次のような設定は避けてください。
{
"winapp.appDirectories": [
"C:/work/another-repository/app",
"../another-repository/app"
]
}
現在の実装では、ワークスペース外に解決されるエントリは無視され、警告が表示されます。シンボリックリンクやジャンクションを経由してワークスペース外へ出るパスについても検査されます。(GitHub)
ワイルドカードを使わず個別に列挙する
次のようなワイルドカード指定は使わないでください。
{
"winapp.appDirectories": [
"apps/*"
]
}
winapp.appDirectoriesは、各文字列をディレクトリパスとして直接扱う設定です。複数のアプリを対象にする場合は、個別に列挙します。
{
"winapp.appDirectories": [
"apps/client-a",
"apps/client-b",
"apps/client-c"
]
}
パスの入力ミスは自動補正されない
winapp.appDirectoriesを設定すると、拡張機能はそのパスを自動検索の結果としてではなく、明示的な対象として使用します。
たとえば、実際のディレクトリがapps/desktop-clientなのに、次のように入力した場合です。
{
"winapp.appDirectories": [
"apps/desktop-clinet"
]
}
明示設定では自動検索を省略するため、正しいディレクトリへ自動的に置き換えられることは期待できません。フォルダー名のスペル、大文字と小文字、階層を確認してください。(GitHub)
1件設定すると選択画面は表示されない
対象を1件だけ設定した場合、QuickPickが表示されないのは正常です。
{
"winapp.appDirectories": [
"apps/desktop-client"
]
}
対象を選択する画面を毎回表示したい場合は、2件以上を設定します。
F5デバッグとは設定箇所が異なる
winapp.appDirectoriesは、主にコマンド実行時のプロジェクトコンテキストを決定する設定です。
F5デバッグでは、launch.jsonのinputFolderやworkingDirectory、ビルド済みの.exeがある出力フォルダーなどが関係します。WinAppコマンドの対象は正しくなったのに、F5で別の実行ファイルが起動する場合は、.vscode/launch.jsonを確認してください。(GitHub)
症状別の確認方法
| 症状 | 主な原因 | 対処 |
|---|---|---|
| ワークスペースルートが自動選択される | ルートが対応プロジェクトとして認識されている | winapp.appDirectoriesでサブフォルダーを指定 |
| 別の1プロジェクトが自動選択される | 自動検出結果がその1件だけになっている | 対象ディレクトリを明示 |
| 不要な候補が大量に表示される | サンプルやツールも対応プロジェクトとして検出されている | 必要なアプリだけを列挙 |
| 目的のアプリが候補にない | 検出されていない、または10件で検索が停止した | winapp.appDirectoriesで直接指定 |
| 設定しても自動検索される | 配列が空、または設定名が間違っている | 1件以上のパスとキー名を確認 |
| 設定した候補が表示されない | パスがワークスペース外 | ワークスペースルートからの相対パスに修正 |
| MSIX作成時の対象が変わらない | コマンドが入力フォルダーを直接選択する方式 | MSIX作成画面の入力フォルダーを確認 |
| 拡張機能を更新できない | VS Codeのバージョンが古い | VS Code 1.109.0以降へ更新 |
| 古い動作が続く | 拡張機能やウィンドウが再読み込みされていない | バージョン確認後にReload Windowを実行 |
チーム開発ではsettings.jsonをリポジトリに含めるべきか
チーム全員が同じアプリを操作する場合は、.vscode/settings.jsonをGitで共有すると、開発者ごとの対象選択ミスを減らせます。
たとえば、本番アプリとサンプルアプリが混在している場合は、本番対象だけを設定します。
{
"winapp.appDirectories": [
"apps/customer-client",
"apps/administrator-console"
]
}
一方、開発者によって担当アプリが異なる場合、1件だけを固定すると他のメンバーが使いにくくなります。その場合は、チームで操作する可能性があるアプリを複数登録し、QuickPickで選択する運用が適しています。
リポジトリ構成を変更したときは、アプリの移動と同じコミットで.vscode/settings.jsonも更新してください。設定が古いままだと、存在しないディレクトリを対象にする原因になります。
それでも解決しない場合の切り分け
次の順番で確認すると、原因を絞り込みやすくなります。
- WinApp VS Code拡張がv0.2以降か確認する
- VS Codeでどのフォルダーをワークスペースルートとして開いているか確認する
.vscode/settings.jsonの配置場所を確認するwinapp.appDirectoriesが空配列になっていないか確認する- パスがワークスペースルートからの相対パスになっているか確認する
- 指定先がプロジェクトファイルではなくディレクトリになっているか確認する
Developer: Reload Windowを実行する- 対象コマンドが
winapp.appDirectoriesを使う種類か確認する WinApp: Get WinApp Pathなどで対象選択を確認する
問題が拡張機能によるプロジェクト選択やQuickPickの表示にある場合は、WinApp VS Code拡張のリポジトリへ報告します。WinApp CLI自体のコマンド処理に問題がある場合は、WinApp CLI側へ報告するのが公式の切り分けです。(Microsoft Dev Blogs)
モノレポでは明示設定を安全装置として使う
WinApp VS Code拡張v0.2では、リポジトリ直下を開いたまま、サブフォルダー内のWindowsアプリを操作できるようになりました。v0.1で必要だった「対象アプリのフォルダーを開き直す」という回避策は、基本的に不要です。
ただし、自動検出はワークスペースルートを優先し、検出結果が1件なら自動的に選択します。複数のアプリ、サンプル、ツール、異なるフレームワークが混在するモノレポでは、意図したプロジェクトが必ず選ばれるとは限りません。
まずWinApp拡張をv0.2以降へ更新し、そのうえで次の設定を追加してください。
{
"winapp.appDirectories": [
"apps/対象アプリのディレクトリ"
]
}
対象が1件なら自動選択、複数件なら限定されたQuickPickになります。設定後は確認系コマンドで選択結果を検証し、チームで共通利用する場合は.vscode/settings.jsonもリポジトリで管理するのが安全です。
なお、WinApp CLIとWinApp VS Code拡張は公開プレビュー段階です。今後、設定項目や検出動作が変更される可能性があるため、拡張機能の更新時にはリリース情報も確認してください。([Visual Studio Marketplace][4])
[4]: https://marketplace.visualstudio.com/items?itemName=Microsoft-WinAppCLI.winapp “
WinApp – Visual Studio Marketplace
“

コメント