Skip to content

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はビルド最適化のために、スクリプトフェーズの入力ファイル出力ファイルを分析します。出力ファイルが指定されていない場合:

  1. スクリプトが常に実行される
  2. 依存関係を正しく判断できない
  3. 増分ビルドが効かず全体ビルド時間が増加

Apple公式ドキュメントでは、入力/出力ファイルの指定が推奨されています

効果的な解決方法

方法1: 出力ファイルを明示的に指定する(推奨)

事前確認

スクリプトで生成するファイルがないか確認してください。生成物がない場合でも、ダミーファイルを使用できます。

具体的な手順:

  1. Xcodeプロジェクトを開く
  2. ターゲットを選択 → Build Phasesタブを開く
  3. 警告が出ているRun Scriptを選択
  4. 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プロジェクトでの追加対策

  1. flutter cleanflutter pub get の実行
  2. FLUTTER_ROOT パスの検証(Build Settings)
  3. Pod関連ファイルのリセット:
bash
rm -rf Pods Podfile.lock .symlinks ios/Pods
pod install --repo-update

Firebase Crashlytics使用時

シンボルファイルアップロードスクリプトでは、依存性分析を無効にする必要が発生する場合があります。その際は出力ファイルの設定を試み、不可能な場合のみ最終手段として無効化を選択してください。

ベストプラクティスまとめ

  1. 出力可能なスクリプト → 必ずOutput Filesを設定
  2. 出力がないスクリプト → ダミーファイルを使用
  3. CocoaPodsスクリプト → Podfile経由で一括修正
  4. ビルド時間最適化 → 依存性分析の無効化は最終手段

上記対策により、Xcodeのビルド警告を解消しつつ、開発効率を維持した効率的なビルドプロセスを実現できます。