Skip to content

chore: VRT専用のホストアプリターゲットを追加してスナップショットテストを高速化する - #332

Open
stotic-dev wants to merge 6 commits into
mainfrom
chore/vrt-host-target
Open

stotic-dev wants to merge 6 commits into
mainfrom
chore/vrt-host-target

Conversation

@stotic-dev

Copy link
Copy Markdown
Owner

概要

VRTのテストホストが homete アプリだったため、スナップショットを撮るたびに AppRoot → HometeInfrastructure → firebase-ios-sdk / GoogleMobileAds / RevenueCat の全体をビルドしていました。firebase-ios-sdk はSPM経由だと gRPC・abseil・leveldb をソースからビルドするため、Xcode Cloud の VRT ワークフローの時間の大半がスナップショットと無関係なコンパイルに費やされています。

スナップショット対象のViewが属する Features / HometeUI / HometeDomain / HometeResources は LocalPackage/Package.swift 上でこれらに一切依存していないので、VRT専用のホストアプリに差し替えてビルドするモジュールを減らします。

経緯は ADR-0029 に記載しました。

変更内容

コミット 内容
refactor: LaunchScreenView を AppRoot → HometeUI へ移動(AppRootをVRT対象外にするため)
chore: VRT専用ホストターゲット hometeVRTHost を追加し、TEST_HOST を差し替え
ci: ci_post_clone.sh の VRT 分岐から Secret_dev.xcconfig の展開を削除
docs: ADR-0029 と CLAUDE.md の更新

設計上のポイント

  • hometeVRTHost は key window を用意するだけの空の App。LocalPackage には一切依存させていません
  • 描画対象のモジュールは hometeSnapshotTests が直接リンクします。ホスト経由(-bundle_loader)でシンボルを解決させると、ホストが参照しないオブジェクトファイルが静的リンク時に落ちうるためです
  • ローカライズは Info.plist の CFBundleLocalizations で ja / en を宣言し、-AppleLanguages (ja) で Locale.current が ja に解決される状態を維持しています(既存の Localizable.xcstrings は全エントリが stale かつ訳文がキーと同一で、表示内容には影響しません)
  • Secret_dev.xcconfig の展開が不要になったのは、Google Mobile Ads SDK がリンクされなくなり GADApplicationIdentifier 未定義による起動時クラッシュが起きなくなったためです

⚠️ マージ前に確認が必要なこと

Xcode Cloud の VRT ワークフローが使っているスキームが hometeSnapshotTests かどうか。

homete スキームを使っている場合、

  1. homete.app がビルドされ続けるので高速化の効果が出ません
  2. このPRで削除した Secret_dev.xcconfig が必要なままなので、VRTが落ちます

その場合はワークフローのスキームを hometeSnapshotTests に変更してください(このスキームは BuildAction が空で、テストターゲットの暗黙依存=hometeVRTHost だけをビルドします)。

確認したこと

  • LocalPackage のビルド: 成功
  • make test-packages: 6ターゲットすべて成功
  • project.pbxproj: plutil -lint OK、参照整合性(ぶら下がり参照・到達不能オブジェクト)ともに問題なし
  • xcodebuild -list: hometeVRTHost を含めてXcodeがプロジェクトを読める
  • SwiftLint: 新規ファイル 0 violations

VRT自体はローカルでは流さない運用なので、スナップショットの一致はこのPRのXcode Cloud実行で確認します。LaunchScreenView の移動によるスナップショット名の変化はない想定です(Prefireはモジュール名ではなくプレビュー名でファイル名を決めるため)。

補足: JSON形式のプロジェクトファイルについて

新フォーマット(.xcodeproj の中身が project.pbxproj → project.xcproj のJSON)は実在しますが、作成・変換に Xcode 27.2 が必要で、2026-09-30時点では beta です(安定版は 27.0)。Xcode Cloud や CocoaPods/Xcodeproj・tuist/XcodeProj など周辺ツールの対応も揃っていないため、今回は従来の pbxproj にターゲットを追加しています。安定版が出た時点でプロジェクト全体の変換として別途検討するのが良さそうです。

🤖 Generated with Claude Code

stotic-dev and others added 4 commits September 30, 2026 01:22
VRT専用ホストアプリはAppRootに依存しない(Firebaseを引き込まないため)。
AppRootに置いたままだとこのViewのスナップショットが撮れなくなるので、
依存がHometeDomain/HometeResourcesだけで済むHometeUIへ移す。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
VRTのテストホストがhometeアプリだったため、AppRoot → HometeInfrastructure
経由でfirebase-ios-sdk(gRPC/abseil/leveldbをソースビルド)・GoogleMobileAds・
RevenueCatのビルドがVRTのたびに必要になっていた。Feature / HometeUI /
HometeDomain / HometeResources はこれらに依存していないので、VRT専用の
ホストに差し替えてビルドするモジュールを減らす。

hometeVRTHostはkey windowを用意するだけの空のAppにして、描画対象の
モジュールはhometeSnapshotTests側が直接リンクする。ホスト経由(BUNDLE_LOADER)
でシンボルを解決させると、ホストが参照しないオブジェクトファイルが
リンク時に落ちうるため。

ローカライズは文字列カタログを持たない代わりにCFBundleLocalizationsで
ja/enを宣言し、-AppleLanguages (ja) でLocale.currentがjaへ解決される
状態を維持する(既存のLocalizable.xcstringsは訳文がキーと同一で、
表示内容には影響しない)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
テストホストをhometeVRTHostに切り替えたことでGoogle Mobile Ads SDKが
リンクされなくなり、GADApplicationIdentifier未定義による起動時クラッシュの
回避目的でデコードしていたxcconfigが不要になった。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-29T18:54:41.674706Z 5627e40 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

stotic-dev and others added 2 commits September 30, 2026 03:51
.prefireIgnored()が付いたプレビューはPrefireが生成コードへ展開しないため、
モジュールが.prefire.ymlに未登録でも、private/fileprivateなシンボルを
参照していてもVRTのビルドは壊れない。AppRootをVRT対象から外したところ、
.prefireIgnored()済みのAppTabViewのプレビューを誤検知していた。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant