.NET 9のMAUIでResourcesに赤い停止マークが出る原因と解決策|Visual Studioと.gitignoreの正しい設定

Visual Studio で .NET 9 の MAUI プロジェクトを開いたとき、Resources フォルダーの横に赤い「停止」マークが出ることがあります。これはビルドエラーではなく、Git の無視設定が原因で表示される状態を示します。この記事では、原因の見極め方から .gitignore の直し方、コマンド例、CI(GitHub Actions)への影響まで、現場でそのまま使える手順で詳しく解説します。

目次

症状:Resources フォルダーに赤い「停止」マークが付く

現象は次のとおりです。Visual Studio(Git 連携有効)で .NET MAUI プロジェクトを開くと、ソリューション エクスプローラーで Resources フォルダーに赤い丸に白線の「停止」マークが重ねて表示されます。プロジェクトは GitHub リポジトリにあり、CI として GitHub Actions も設定済みです。

このときプロジェクトはビルドできる場合もありますが、CI 環境では画像・フォントなどのリソースがコミットされておらず、プラットフォーム別のパッケージング工程で失敗したり、アプリにアイコンやフォントが反映されないといった不具合が発生しがちです。赤いマークは「エラー」ではなく「状態」を表すアイコンなので、まずは意味を正しく押さえましょう。

結論:赤いマークの正体と意味

赤い「停止」マークは、Visual Studio の Git 連携が「このフォルダー(またはファイル)は Git に無視されている(ignored)」と判断したことを示すオーバーレイです。つまり、.gitignore などの除外ルールにより、Git が Resources/ を追跡対象にしていない状態です。フォルダー自体や配下のファイルはローカルには存在しており、ビルドにも使われますが、Git の管理外なので履歴に残らず、他メンバーや CI へ配布されません。

なぜ MAUI の Resources で起きがちなのか

.NET MAUI では、Resources/ 配下に画像(Images/)、フォント(Fonts/)、スプラッシュやアプリアイコン(AppIcon/、Splash/)、生ファイル(Raw/)などを置く運用が一般的です。ところが、リポジトリの .gitignore に

  • Resources/ または **/Resources/* のような包括的な除外ルール
  • 過去の別プロジェクト(WPF/Unity/モノレポなど)由来のルールの流用
  • グローバル gitignore(ユーザー環境)での Resources 除外

が混入していると、MAUI の正規のリソースもまとめて Git に無視されてしまいます。特にモノレポやテンプレートの使い回しでは、**/Resources/* のようなワイルドカードが気づかないうちに MAUI プロジェクトまで巻き込むことがよくあります。

まず押さえる全体像(要約)

  1. .gitignore と除外ルールの所在を特定し、誤ったパターンを修正(必要に応じて例外パターン ! を追加)。
  2. Resources/ を Git に追加・コミット(以前の除外の影響が残る場合は --cached を活用)。
  3. Visual Studio で状態アイコンが消えたことを確認し、CI(GitHub Actions)でビルドが資産込みで通ることを検証。

症状と原因の対応早見表

画面上の症状典型的な原因対処の方向性
Resources に赤い「停止」マーク.gitignore 等により Git が無視除外ルールを直し、フォルダーをコミットする
ローカルでビルド成功、CI で失敗リソース未コミットで CI に素材が届かないリソースを Git に追加し、CI は通常ビルドで OK
一部サブフォルダーだけ赤いマーク部分的な除外(例:**/Resources/Raw/*)必要部分だけ ! で除外解除または削除

手順 1:.gitignore と除外ルールの確認・修正

最初に、除外ルールのありかを洗い出します。Git は複数箇所のルールを統合して解決するため、見落としがちです。

  • リポジトリ直下の .gitignore
  • .git/info/exclude(リポジトリ限定のローカル除外)
  • グローバルの gitignore(git config --get core.excludesfile で確認)

どのファイルが原因かは、次のコマンドで判別できます。

# どのルールに引っかかっているかを表示(-v で出所も出る)
git check-ignore -v Resources/

修正対象の例:

# 悪い例(MAUI でもっとも事故る)
Resources/
**/Resources/*

# NG の副作用例(Raw だけを無視してしまう)

**/Resources/Raw/*

修正は次のいずれかです。

  • 問題の行を削除する。
  • 一時対応なら行頭に # を付けてコメントアウト。
  • 広い除外を残しつつ MAUI プロジェクトだけ許可したいときは例外パターンを追加(下例)。
# 既存の広い除外を残すが、MAUI プロジェクト直下の Resources は許可
**/Resources/*
!src/apps/MyMauiApp/Resources/**

MAUI 向けのシンプルで安全な最小 .gitignore 例は次のとおりです。

# .NET 共通
bin/
obj/
.debug/
.release/
.vs/

# ユーザー環境ファイル

*.user
*.suo

# MAUI で生成される中間物(通常は追跡不要)

**/Platforms/Android/*/cache/
**/PlatformResources/*

# 重要:Resources は除外しない

#(画像、フォント、AppIcon、Splash、Raw などを含む)

# Resources/  ← ← ← ここは書かない

保存したら、git status --ignored -uall を実行して、Resources/ が「無視(ignored)」から外れていることを確認します。

手順 2:Resources/ を Git に追加する

除外ルールを直しただけでは、過去に適用されたキャッシュの影響や、すでに「無視」として扱われていた履歴が残っている場合があります。確実に追跡させるには、以下のいずれかを実行します。

フォルダー全体を強制追加

git add -f Resources/
git commit -m "Resources フォルダーをバージョン管理に追加"

-f は「無視設定にかかわらず強制的にステージングする」オプションです。除外ルールが完全に撤廃できていないときも確実に追加できます。

一度キャッシュを外してから追加(頑固なケース)

# 追跡対象から外す(ファイルはディスクに残る)
git rm -r --cached Resources/

# 直した .gitignore のもとで再追加

git add Resources/
git commit -m "Fix: Resources を正しく追跡"

サブフォルダー単位で制御したい場合(例:AppIcon と Fonts だけ追跡)には、対象のディレクトリを個別に追加します。

git add -f Resources/AppIcon/ Resources/Fonts/
git commit -m "AppIcon と Fonts を追跡"

手順 3:Visual Studio で状態を確認する

  • ソリューション エクスプローラーで Resources の赤いマークにマウスを載せ、ポップアップの状態表示が「Ignored by Git」から変化したかを確認。
  • 「Git 変更」ウィンドウに Resources/ 配下のファイルが表示され、コミット対象として扱われていることを確認。
  • 変更をプッシュして、リモート(GitHub)側でファイルが存在することを確認。

この時点で、赤い「停止」マークは消え、通常のフォルダーアイコンに戻ります。

CI(GitHub Actions)への影響と最小構成

リソースがリポジトリに存在しない場合、CI では次のような問題が起きます。

  • アプリアイコンやスプラッシュが生成できない。
  • カスタムフォントや画像がコピーされず UI が崩れる。
  • プラットフォーム固有プロジェクトで None/Content 扱いのファイルが見つからず失敗。

解決はシンプルで、Resources をコミットしておけば、通常のワークフローでそのままビルドできます。参考として、MAUI のビルド最小構成の YAML 例を載せます(要点は「リソースをリポジトリに含める」ことです)。

name: build-maui
on:
  push:
    branches: [ main ]
  pull_request:

jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0


  - name: Setup .NET
    uses: actions/setup-dotnet@v4
    with:
      dotnet-version: '9.0.x'

  - name: Install MAUI workload
    run: dotnet workload install maui

  - name: Restore
    run: dotnet restore src/MyMauiApp/MyMauiApp.csproj

  - name: Build
    run: dotnet build -c Release src/MyMauiApp/MyMauiApp.csproj

  # 必要に応じて Publish / artifact upload を追加

MAUI の Resources 構成と .csproj の例

MAUI の既定では、Resources 配下のファイルは SDK によって自動検出されます。以下は分かりやすい典型構成の一例です。

MyMauiApp/
└─ Resources/
   ├─ AppIcon/
   │   └─ appicon.svg
   ├─ Splash/
   │   └─ splash.svg
   ├─ Fonts/
   │   └─ OpenSans-Regular.ttf
   ├─ Images/
   │   ├─ logo.png
   │   └─ banner.jpg
   └─ Raw/
       └─ sample.json

.csproj で明示したい場合のスニペット(必要に応じて使用)。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net9.0-android;net9.0-ios;net9.0-maccatalyst</TargetFrameworks>
    <UseMaui>true</UseMaui>
  </PropertyGroup>








原因切り分け:どの除外ルールに当たっているかを突き止める

実務では「どのファイルのどの行が当たっているのか」を素早く見抜くことが解決の近道です。次のコマンド群を活用してください。

目的コマンドポイント
除外の出所を確認git check-ignore -v Resources/どの .gitignore/exclude が当たったか行番号つきで表示
無視されているものを一覧git status --ignored -uall「ignored」に Resources/ が出なくなれば OK
グローバル gitignore の場所git config --get core.excludesfileユーザー環境の除外も見落とさない

よくある落とし穴と対策

  • モノレポの上位 .gitignore の影響:ルートにある **/Resources/* が全サブプロジェクトに効いてしまうことがあります。該当行を削るか、プロジェクト配下を許可する例外 (!src/apps/MyMauiApp/Resources/**) を追加します。
  • 空ディレクトリ問題:Git は空フォルダーを保存しません。将来ファイルを置く予定で空の Resources を共有したいなら、.gitkeep を入れてコミットします(.gitkeep 自体は慣習名で中身は空でOK)。
  • 成果物の混在:デザイナーの出力(例:自動生成の一時PNG)などを誤って追跡すると差分がノイズ化します。原本(例:.svg や .ttf)だけを追跡し、生成物は引き続き無視すると運用が安定します。
  • 部分的な無視:Raw だけを除外しているケースでは、アプリが埋め込みデータを読み込めず実行時エラーにつながることがあります。要件を確認し、必要なディレクトリは除外しない方針に揃えましょう。
  • Visual Studio の「プロジェクトに含めない」と混同:ファイルの右クリックにある「プロジェクトに含めない」は、ビルドや IntelliSense の対象から外す機能です。Git の無視とは別概念で、どちらも状態アイコンが変わるため混乱しがちです。今回の赤い「停止」マークは Git が原因です。

チームでの運用指針(ベストプラクティス)

  • コミット方針:Resources は原則コミット。bin/、obj/、.vs/、生成キャッシュはコミットしない。
  • レビュー観点:画像やフォントの追加時は、.gitignore の影響で「ステージングされていないファイルがないか」をチェックリスト化。
  • CI の確認:Pull Request ビルドで、アプリアイコン・スプラッシュ・フォントが正しく反映されるかの簡易テスト(スクリーンショット比較や UI テスト)を組み込む。
  • グローバル設定の共有:チームメンバーごとの core.excludesfile が暴走しないよう、プロジェクトの .gitignore に明示的な許可(! 例外)を入れておくと事故が減ります。

状態が直らないときの追加チェックリスト

  • git check-ignore -v で本当に除外が外れているか。
  • Visual Studio を再起動、または「キャッシュの更新」(ファイル > フォルダーを開く> 再読み込み 相当)を実施。
  • ファイルシステムの大文字・小文字差(Resources と resources)で別扱いになっていないか。
  • サブモジュールやワークツリー(worktree)を使っていないか(別の .git にぶら下がっていると見え方が変わる)。
  • ウイルス対策や同期ツールにより、一部の拡張子だけがブロックされていないか。

参考:コマンドの “意味” を理解して安全に運用する

コマンド何をするかいつ使うか
git add -f PATH無視設定にかかわらず強制でステージング暫定的に除外解除したいとき
git rm -r --cached PATH履歴上の追跡だけを解除(実ファイルは残す)誤った追跡状態をリセットしたいとき
git check-ignore -v PATHどの除外ルールに一致したかを特定原因の所在を素早く突き止めたいとき

FAQ

Q. 赤い「停止」マークが付いていてもローカルでビルドは通ります。直す必要はありますか?

A. ローカルでは通っても、CI や他メンバーにはリソースが配布されず不具合の温床になります。チーム開発と再現性のため、Resources は追跡しましょう。

Q. 除外ルールをどうしても外せない事情があります。

A. 広い除外を残しつつ、対象プロジェクト配下だけを許可する ! 例外パターンを使います。モノレポで有効です。

Q. Resources を全部コミットするとリポジトリが重くなりませんか?

A. 画像の原本(SVG など)と必要なバイナリフォントのみを追跡し、生成物は無視する設計にすれば不要な肥大化を防げます。大容量素材は LFS(Large File Storage)等の選択も検討可能です。

Q. Visual Studio の「プロジェクトに含める/含めない」と Git の無視は何が違いますか?

A. 前者はビルドや IntelliSense の対象かどうか、後者は履歴管理するかどうかの違いです。赤い「停止」マークは Git 側の状態を示しています。

まとめ

MAUI の Resources に赤い「停止」マークが付く主因は、.gitignore などによる「Git に無視」状態です。対処の核心は、除外ルールを正す → Resources をコミットする → Visual Studio で状態確認 の 3 ステップ。これでアイコンは消え、チームや CI でも同じ資産でビルドできる再現性が確保されます。ビルド成果物は引き続き無視しつつ、変更管理すべきリソースは確実に追跡する──このシンプルな方針が、.NET 9 / MAUI 時代の開発を安定させる最短ルートです。


実践チェックリスト(コピペ用)

  • git check-ignore -v Resources/ で出所を特定した。
  • .gitignore から Resources/ および **/Resources/* を削除または例外で解除した。
  • git status --ignored -uall で「ignored」から外れたことを確認した。
  • git add -f Resources/ → git commit で追跡状態にした。
  • Visual Studio の赤い「停止」マークが消えた。
  • GitHub にプッシュし、CI ビルドで資産が反映されることを確認した。

付録:トラブル再発を防ぐための .gitignore 例

# ====== .NET / Visual Studio ======
bin/
obj/
.vs/
*.user
*.suo

# ====== MAUI 一時ファイル(必要に応じて調整)======

**/PlatformResources/*
**/*/cache/

# ====== 重要:Resources は除外しない ======

# Resources/     ← 追加しない

# ====== 生成物やアーカイブ ======

*.zip
*.7z
*.tar
*.tgz

# ====== OS ごとのノイズ ======

.DS_Store
Thumbs.db

付録:問題と解決の要点まとめ(表)

項目要点
アイコンの意味赤い「停止」マーク=Git の無視(ignored)
主因.gitignore や .git/info/exclude、グローバル除外の誤設定
診断git check-ignore -v、git status --ignored -uall
対処除外ルールの削除/例外追加、git add -f Resources/ → commit
再発防止モノレポでの例外指定、レビュー時のステージング確認、生成物は引き続き除外

最後に

赤いマークは「危険信号」ではなく「見落とし注意」のサインです。Resources はアプリ体験の根幹を支える資産フォルダー。ここを確実に Git で管理できれば、ローカル・レビュー・CI/CD・ストア提出のどの段階でも一貫した成果が保証されます。本記事の手順をそのまま適用して、今日から赤いマーク問題を解消しましょう。

この記事を書いた人

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

コメント

コメントする

目次