Xcodeビルド警告「Run script does not specify outputs」の解決法
警告の概要
Xcodeでプロジェクトをビルドする際、次の警告が表示されることがあります:
warning: Run script build phase 'Module名' will be run during every build because it does not specify any outputs.
これはビルドスクリプトが出力ファイルを指定していないため、毎回のビルドでスクリプトが実行され、ビルド時間が無駄に増加する問題を示しています。
問題の根本原因
Xcodeはビルド最適化のために、スクリプトフェーズの入力ファイルと出力ファイルを分析します。出力ファイルが指定されていない場合:
- スクリプトが常に実行される
- 依存関係を正しく判断できない
- 増分ビルドが効かず全体ビルド時間が増加
Apple公式ドキュメントでは、入力/出力ファイルの指定が推奨されています。
効果的な解決方法
方法1: 出力ファイルを明示的に指定する(推奨)
事前確認
スクリプトで生成するファイルがないか確認してください。生成物がない場合でも、ダミーファイルを使用できます。
具体的な手順:
- Xcodeプロジェクトを開く
- ターゲットを選択 →
Build Phases
タブを開く - 警告が出ている
Run Script
を選択 Output Files
セクションに出力パスを追加
出力例(Flutterプロジェクトの場合)
bash
# Run Script内(スクリプト処理後に空ファイルを生成)
touch "${BUILT_PRODUCTS_DIR}/dummy_output.txt"
bash
$(BUILT_PRODUCTS_DIR)/dummy_output.txt
bash
# 既存のスクリプト内容
flutter packages pub run build_runner build --delete-conflicting-outputs
# ダミーファイル生成(出力先にファイル作成)
touch "${BUILT_PRODUCTS_DIR}/script_output.timestamp"
text
${BUILT_PRODUCTS_DIR}/script_output.timestamp
方法2: CocoaPodsが原因の場合の自動修正(高度なユーザー向け)
CocoaPodsユーザー向け
Pod関連スクリプト([CP]
から始まる名前)の場合、以下のようにPodfileを修正できます。
ruby
post_integrate do |installer|
installer.aggregate_targets[0].user_project.targets.each do |target|
target.build_phases.grep(Xcodeproj::Project::Object::PBXShellScriptBuildPhase).each do |phase|
if phase.name.start_with?("[CP]") &&
(phase.input_paths || []).empty? &&
(phase.output_paths || []).empty?
phase.always_out_of_date = "1" # 依存性分析を無効化
end
end
end
installer.aggregate_targets[0].user_project.save
end
このスクリプトの効果:
- CocoaPods生成スクリプトを自動検出
- 入力/出力未定義のスクリプトに対して依存性分析を無効化
- 警告を解消しつつビルド最適化を維持
非推奨な回避策:依存性分析の無効化
パフォーマンス警告
この方法は警告を非表示にするだけで根本解決にならず、毎回のスクリプト実行によるビルド時間増加が発生します。
markdown
1. `Build Phases`で対象Run Scriptを選択
2. `Based on dependency analysis`チェックを外す
フレームワーク別の注意点
Flutterプロジェクトでの追加対策
flutter clean
とflutter pub get
の実行FLUTTER_ROOT
パスの検証(Build Settings)- Pod関連ファイルのリセット:
bash
rm -rf Pods Podfile.lock .symlinks ios/Pods
pod install --repo-update
Firebase Crashlytics使用時
シンボルファイルアップロードスクリプトでは、依存性分析を無効にする必要が発生する場合があります。その際は出力ファイルの設定を試み、不可能な場合のみ最終手段として無効化を選択してください。
ベストプラクティスまとめ
- 出力可能なスクリプト → 必ず
Output Files
を設定 - 出力がないスクリプト → ダミーファイルを使用
- CocoaPodsスクリプト → Podfile経由で一括修正
- ビルド時間最適化 → 依存性分析の無効化は最終手段
上記対策により、Xcodeのビルド警告を解消しつつ、開発効率を維持した効率的なビルドプロセスを実現できます。