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 プロジェクトまで巻き込むことがよくあります。
まず押さえる全体像(要約)
.gitignoreと除外ルールの所在を特定し、誤ったパターンを修正(必要に応じて例外パターン!を追加)。Resources/を Git に追加・コミット(以前の除外の影響が残る場合は--cachedを活用)。- 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・ストア提出のどの段階でも一貫した成果が保証されます。本記事の手順をそのまま適用して、今日から赤いマーク問題を解消しましょう。

コメント