WinAppがモノレポで別プロジェクトを選ぶ原因とwinapp.appDirectories設定

リポジトリ直下をVS Codeで開いたとき、WinAppコマンドが対象アプリではなく別のサブプロジェクトやワークスペースルートを選んでしまう場合は、WinApp VS Code拡張をv0.2以降へ更新してください。それでも候補が多い、または特定のアプリだけを対象にしたい場合は、.vscode/settings.jsonwinapp.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以降の対象ディレクトリ決定には、次の優先順位があります。

  1. winapp.appDirectoriesで指定したディレクトリ
  2. ワークスペースルートにある対応プロジェクト
  3. ワークスペース内を検索して見つかったプロジェクト

つまり、ワークスペースルートがWinApp対応プロジェクトとして認識されると、サブフォルダーの検索より先にルートが選ばれます。これは仕様上の優先順位であり、不具合とは限りません。(GitHub)

たとえば、モノレポルートにElectronを依存関係として含むpackage.jsonがあり、実際に操作したいアプリがapps/clientにある場合、ルートが先にプロジェクトとして認識される可能性があります。

このような構成では、自動検出だけに任せず、次のように対象を明示します。

{
  "winapp.appDirectories": [
    "apps/client"
  ]
}

winapp.appDirectoriesは最優先で評価されるため、ワークスペースルートが対応プロジェクトとして認識されていても、指定したサブフォルダーを対象にできます。

winapp.appDirectoriesの設定手順

WinApp拡張をv0.2以降へ更新する

VS Codeで次の手順を実行します。

  1. CtrlShiftXで拡張機能画面を開く
  2. 「WinApp」を検索する
  3. MicrosoftのWinApp拡張を開く
  4. 更新ボタンが表示されている場合は更新する
  5. 拡張機能のバージョンが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 Project
  • WinApp: Restore Packages
  • WinApp: Update Packages
  • WinApp: Generate Manifest
  • WinApp: Update Manifest Assets
  • WinApp: Add Manifest Execution Alias
  • WinApp: Generate Certificate
  • WinApp: Unregister Package
  • WinApp: Get WinApp Path

一方、ファイルや入力フォルダーを利用者が直接選択するコマンドは、winapp.appDirectoriesによるプロジェクト検出を使いません。

コマンド例対象の決まり方
Initialize Projectwinapp.appDirectoriesまたは自動検出
Restore Packageswinapp.appDirectoriesまたは自動検出
Generate Manifestwinapp.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
ElectronElectron依存関係を含むpackage.json
Tauritauri.conf.json
Flutterpubspec.yaml
RustCargo.toml
C++CMakeLists.txt

モノレポ内に複数のCargo.tomlCMakeLists.txtがある場合、WinAppの対象として意図していないツールやサンプルも候補になる可能性があります。

また、自動検索で表示されるプロジェクト数には上限があり、10件に達すると検索が停止します。大規模なモノレポで目的のアプリが候補に表示されない場合も、winapp.appDirectoriesで直接指定するのが確実です。(GitHub)

設定時に間違えやすいポイント

プロジェクトファイルではなくディレクトリを指定する

次のように.csprojpackage.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.jsoninputFolderworkingDirectory、ビルド済みの.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も更新してください。設定が古いままだと、存在しないディレクトリを対象にする原因になります。

それでも解決しない場合の切り分け

次の順番で確認すると、原因を絞り込みやすくなります。

  1. WinApp VS Code拡張がv0.2以降か確認する
  2. VS Codeでどのフォルダーをワークスペースルートとして開いているか確認する
  3. .vscode/settings.jsonの配置場所を確認する
  4. winapp.appDirectoriesが空配列になっていないか確認する
  5. パスがワークスペースルートからの相対パスになっているか確認する
  6. 指定先がプロジェクトファイルではなくディレクトリになっているか確認する
  7. Developer: Reload Windowを実行する
  8. 対象コマンドがwinapp.appDirectoriesを使う種類か確認する
  9. 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

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次