はい、承知いたしました。Xcodeエラー「command phasescriptexecution failed with a nonzero exit code」の原因と対処法について、詳細な説明を含む約5000語の記事を作成します。
Xcodeエラー徹底解説:command phasescriptexecution failed with a nonzero exit code の原因と完全対処法
XcodeでのiOS/macOSアプリ開発において、ビルド中に突然遭遇するエラーメッセージの中でも、特に多くの開発者を悩ませるものの一つに command phasescriptexecution failed with a nonzero exit code
があります。
このエラーは、まるで「スクリプトが失敗した」とだけ告げられて、具体的な理由を教えてくれないかのように感じられるかもしれません。しかし、このメッセージはビルドプロセスの特定フェーズで発生した問題を示しており、その原因は多岐にわたるものの、適切な手順を踏めば必ず特定し、解決することができます。
本記事では、この command phasescriptexecution failed with a nonzero exit code
エラーについて、そのエラーメッセージが示す意味から、具体的な原因の特定方法、そして最も頻繁に遭遇する原因ごとの詳細な対処法までを、約5000語にわたって徹底的に解説します。この記事を読むことで、あなたがこのエラーに遭遇した際に、慌てず、効率的に問題を解決できるようになることを目指します。
1. command phasescriptexecution failed with a nonzero exit code
とは何か? Xcodeビルドプロセスの理解
このエラーメッセージの意味を深く理解するためには、まずXcodeのビルドプロセスがどのように行われているかを知る必要があります。
Xcodeは、ソースコードやリソースファイルから最終的なアプリケーションバンドルを生成するために、いくつかの段階(フェーズ)を経てビルドを実行します。代表的なフェーズには以下のようなものがあります。
- Preprocessing: ソースコードの前処理を行います。
- Compilation: ソースコードをコンパイラ(Swiftの場合は
swiftc
、Objective-C/C/C++の場合はclang
)を使ってオブジェクトファイルにコンパイルします。 - Linking: コンパイルされたオブジェクトファイルやライブラリをリンクして、実行可能ファイルを生成します。
- Copying Resources: アセットカタログ、画像ファイル、設定ファイルなどのリソースをアプリケーションバンドルにコピーします。
- Code Signing: アプリケーションにデジタル署名を行います。これはiOSデバイス上でアプリを実行するために必須です。
- Run Script Execution (PhaseScriptExecution): ビルド設定で定義されたカスタムスクリプトを実行します。
今回のエラーメッセージに含まれる phasescriptexecution
は、まさにこの「Run Script Execution」フェーズを指しています。つまり、エラーはビルドプロセス中に実行された何らかのスクリプトが原因で発生していることを示唆しています。
では、failed with a nonzero exit code
とは何を意味するのでしょうか?
Unix/Linux/macOSなどのオペレーティングシステムでは、コマンドやスクリプトが終了する際に「終了コード (exit code)」を返します。
- 終了コード 0: これは、コマンドまたはスクリプトが正常に終了したことを示します。
- 非ゼロの終了コード (例: 1, 2, 127など): これは、コマンドまたはスクリプトが何らかのエラーや問題によって異常終了したことを示します。終了コードの値自体が具体的なエラーの種類を示す場合もありますが、多くの場合、非ゼロであれば「失敗」として扱われます。
したがって、command phasescriptexecution failed with a nonzero exit code
というエラーメッセージは、総合すると以下の意味になります。
「Xcodeのビルドプロセスにおけるスクリプト実行フェーズ(PhaseScriptExecution)で実行されたコマンド(スクリプト)が、正常ではない非ゼロの終了コードを返して終了した」
これは、このフェーズで実行されるべきスクリプト内部で何か問題が発生し、それが原因でビルドが中断されたことを意味します。
2. PhaseScriptExecutionフェーズで実行されるスクリプトの例
PhaseScriptExecution
フェーズは、Xcodeプロジェクトのビルド設定における「Build Phases」タブで「Run Script」として定義されるカスタムスクリプトを実行するために存在します。このフェーズでは、開発者が特定のタイミングで自動化したい様々な処理を実行できます。
一般的なXcodeプロジェクトでこのフェーズで実行される可能性のあるスクリプトには、以下のようなものがあります。
- 依存関係マネージャ関連:
- CocoaPods:
pod install
実行後、Pods.xcodeproj
に追加されるEmbed Pods Frameworks
やCopy Pods Resources
といったスクリプトがこのフェーズで実行されます。これらのスクリプトは、インストールされたPodライブラリのフレームワークをアプリケーションバンドルに組み込んだり、リソースをコピーしたりするために不可欠です。 - Carthage: ビルドされたフレームワークをプロジェクトに追加した後、Carthageが提供する
carthage copy-frameworks
スクリプトをRun Scriptとして追加することが一般的です。このスクリプトもPhaseScriptExecutionで実行され、フレームワークをバンドルにコピーします。
- CocoaPods:
- コード生成ツール:
SwiftGen
,R.swift
などのアセットやローカライズされた文字列への型安全なアクセスを提供するツールが、ソースコードを生成するためにこのフェーズで実行されることがあります。
- 静的解析ツール/リンター:
SwiftLint
などのリンターが、ビルド中にコードスタイルや潜在的な問題をチェックするために実行されることがあります。
- 独自スクリプト:
- 開発チームが独自に作成したスクリプト(例: バージョン番号の自動更新、特定のファイルのコピー、設定ファイルの書き換えなど)がこのフェーズに追加されている場合があります。
- Build System Plugins: Xcode 13以降で導入されたBuild System Pluginsも、内部的にはスクリプト実行を伴う場合があります。
このように、PhaseScriptExecutionフェーズはプロジェクトによって様々なスクリプトが実行される可能性がある、非常に柔軟性の高いフェーズです。それゆえに、エラーの原因も多岐にわたる可能性があります。
3. 原因特定のための最重要ステップ:ビルドログの確認
command phasescriptexecution failed with a nonzero exit code
というエラーメッセージ自体は、問題が発生したフェーズを示しているだけで、具体的な原因はほとんど教えてくれません。原因を特定するためには、Xcodeのビルドログを徹底的に確認することが最も重要です。
ビルドログには、Xcodeがビルド中に実行したコマンド、その標準出力(stdout)、および標準エラー出力(stderr)が詳細に記録されています。スクリプトが失敗した場合、多くの場合、そのエラーメッセージや原因に関するヒントが標準エラー出力に記録されています。
ビルドログを確認する手順は以下の通りです。
- Report Navigatorを開く: Xcodeのナビゲーションエリアで、右から2番目のアイコン(吹き出しのようなアイコン)をクリックするか、
Command + 8
のショートカットキーを押してReport Navigatorを開きます。 - 失敗したビルドを探す: Report Navigatorには、過去のビルド履歴が表示されます。エラーが発生したビルド(通常はリストの最上部にある直近のビルド)を探します。ビルドが失敗した場合は、アイコンが赤く表示されます。
- エラーが発生した行を展開する: 失敗したビルドをクリックし、表示されるビルドステップのリストを確認します。
PhaseScriptExecution
という名前のステップの横に赤いエラーアイコンが表示されているはずです。そのステップをクリックして詳細を展開します。 -
実行されたスクリプトコマンドと出力を確認する:
PhaseScriptExecution
ステップを展開すると、Xcodeが実行しようとした具体的なコマンド(例:/bin/sh -c ...
で始まる長い文字列)と、そのコマンドの実行中に標準出力や標準エラー出力に出力された内容が表示されます。ここに、エラーの具体的な原因を示すメッセージやヒントが隠されています。output:
またはerror:
といったラベルの後に表示されるメッセージを注意深く読みます。- 長いメッセージの場合、スクロールするか、テキストエディタにコピー&ペーストして全体を確認します。
- エラーメッセージはしばしば英語ですが、重要なキーワード(例:
error
,failed
,No such file or directory
,Permission denied
,command not found
,syntax error
,exit code
, ファイルパスやディレクトリ名、特定のツールのエラー出力など)を探します。 - 特に、非ゼロ終了コードを返した具体的なコマンドが何であるか、そのコマンドがどのような引数で実行されたかを確認します。
ビルドログのこの部分に、スクリプトがなぜ失敗したのか、最も直接的な情報が含まれています。例えば、「command not found: pod
」のようなメッセージが表示されていれば、CocoaPodsのpod
コマンドが見つからなかったことが原因だと推測できます。
4. 主な原因とそれぞれの詳細な対処法
ビルドログの確認によって得られた情報をもとに、具体的な原因を絞り込み、適切な対処を行います。ここでは、command phasescriptexecution failed with a nonzero exit code
エラーの主な原因とその詳細な対処法をカテゴリ別に解説します。
原因 1: スクリプトで使用されているコマンドが見つからない、または実行権限がない
説明: ビルドスクリプトの中で実行しようとしている外部コマンド(例: pod
, carthage
, swiftlint
, ruby
, python
, またはユーザーがインストールした別のツール)が、Xcodeがスクリプトを実行する環境のPATH環境変数に含まれていないか、そもそもインストールされていない、あるいは実行ファイルに適切な実行権限 (chmod +x
) が付与されていない場合に発生します。
ビルドログには、以下のようなメッセージが表示されることが多いです。
command not found: [コマンド名]
No such file or directory: [スクリプトファイルまたはコマンドパス]
Permission denied
詳細な対処法:
-
コマンドがインストールされているか確認する:
- エラーログで特定されたコマンド(例:
pod
,carthage
,swiftlint
など)が、あなたのMacに正しくインストールされているか確認します。 - ターミナルを開き、
which [コマンド名]
コマンドを実行してみます。(例:which pod
)。コマンドがインストールされていれば、その絶対パス(例:/usr/local/bin/pod
)が表示されます。表示されない、あるいは「command not found」と表示される場合は、コマンドがインストールされていないか、PATHが通っていません。 - 必要であれば、Homebrew (
brew install [パッケージ名]
)、RubyGems (gem install [gem名]
)、pip (pip install [パッケージ名]
) などのパッケージマネージャを使ってコマンドをインストールまたは再インストールします。
- エラーログで特定されたコマンド(例:
-
PATH環境変数の確認と設定:
- Xcodeがスクリプトを実行する際のPATH環境変数は、ターミナルであなたがインタラクティブに操作しているシェルのPATHと異なる場合があります。特にGUIアプリケーションであるXcodeは、システムデフォルトに近いPATHを使用することが多いです。
- スクリプト内でPATHを明示的に設定する: 最も確実な方法の一つは、エラーを起こしているRun Scriptの先頭で、必要なディレクトリをPATHに追加することです。
bash
#!/bin/sh
export PATH="/usr/local/bin:$PATH" # Homebrewなどでインストールしたコマンドのパスを追加
export PATH="$HOME/.rvm/bin:$PATH" # rvmなどでインストールしたRubyコマンドのパスを追加 (必要に応じて)
# ... 元のスクリプトの内容 ...
追加すべきパスは、which [コマンド名]
で確認したパス(のディレクトリ部分)や、使用しているパッケージマネージャ(Homebrewなら/usr/local/bin
または/opt/homebrew/bin
)のデフォルトのインストール先などを参考にします。 - Xcodeのビルド設定でPATHを設定する: プロジェクトまたはターゲットのBuild Settingsで、
PATH
というユーザー定義設定を追加し、必要なパスを設定することも可能です。ただし、スクリプト内で設定する方が一般的で柔軟性が高いです。 - シェルの確認: Run ScriptのShebang (
#!/bin/sh
または#!/bin/bash
,#!/bin/zsh
など) と、Build SettingsのShell設定が一致しているか確認します。特定のシェルに依存するコマンド(例えばZsh特有の機能を使うスクリプト)を使っている場合は注意が必要です。多くの場合、/bin/sh
が使用されますが、これはシンボリックリンクで/bin/bash
や/bin/zsh
を指していることがあります。必要に応じて明示的に/bin/bash
などを指定します。
-
実行権限の確認:
- もしエラーメッセージが
Permission denied
を含んでいる場合、実行しようとしているスクリプトファイル自体や、スクリプトが呼び出す実行ファイルに実行権限が付与されていない可能性があります。 - ターミナルで、問題のファイルパスに対して
ls -l [ファイルパス]
コマンドを実行し、権限を確認します。権限を示す文字列(例:-rwxr-xr-x
)の最初の3文字目が-rw-
のようになっている場合、所有者に実行権限がありません。 - 実行権限がない場合は、
chmod +x [ファイルパス]
コマンドで実行権限を付与します。
- もしエラーメッセージが
-
Apple Silicon (M1/M2/M3 Mac) と Rosetta 2:
- Apple Silicon搭載のMacを使用している場合、Intel Mac用にビルドされた一部のツール(特に古いgemやbrewパッケージ)は、そのままでは実行できないことがあります。
- ターミナルの種類を確認する: 使用しているターミナルがApple Siliconネイティブ版 (
arm64
) か、Rosetta 2で動作するIntel版 (x86_64
) か確認します。arch
コマンドで確認できます。 - Xcodeの起動環境: XcodeをRosetta 2で起動することで、Intel版のツールチェーンを利用できるようになります。Xcodeアプリを右クリックし、「情報を見る」を選択、「Rosettaを使用して開く」にチェックを入れてXcodeを再起動します。ただし、これは根本的な解決策ではなく、ビルド速度が低下する可能性もあります。可能であれば、Apple Siliconネイティブ対応版のツールをインストールすることが望ましいです。例えば、HomebrewはApple Silicon環境では
/opt/homebrew
にインストールされます。PATH設定時にこのパスを含める必要があります。
原因 2: スクリプト内部でのシンタックスエラーまたは論理エラー
説明: 実行されたスクリプト自体のコードに誤りがある場合です。シェルスクリプト、Rubyスクリプト、Pythonスクリプトなど、どのような言語で書かれていても発生し得ます。
ビルドログには、スクリプトインタープリタ(sh
, bash
, ruby
, python
など)からのエラーメッセージが表示されます。例えば、シェルスクリプトであれば以下のようなメッセージが含まれることがあります。
syntax error: unexpected end of file
line [行番号]: [特定の構文エラー]
unbound variable
command returned nonzero exit code [コード]
, その前にスクリプト内部のコマンドのエラーが出力されている
詳細な対処法:
- エラーログに示されたスクリプト内容を確認する: ビルドログには、実行されたスクリプトの全体または一部が記載されています。その内容と、エラーメッセージが示している行番号や箇所を注意深く確認します。
- 該当するスクリプトコードを修正する:
- Build PhasesのRun Scriptセクションに直接記述されている場合は、Xcode上で修正します。
- PodfileやCartfileの
post_install
フックなどでスクリプトが定義されている場合は、それらのファイルを修正します。 - 外部のスクリプトファイルを参照している場合は、そのファイルを修正します。
- シンタックスエラーの修正: シェルスクリプトの場合、括弧の対応、引用符の使い方、変数名の誤り、コマンド名のタイポなどを確認します。RubyやPythonなどの場合は、それぞれの言語のシンタックスルールに従って修正します。
- 論理エラーのデバッグ:
- スクリプトが依存しているファイルやディレクトリが存在するか(パスが正しいか)確認します。ビルド環境では、ターミナルで手動実行する場合とカレントディレクトリや環境変数が異なる可能性があるため注意が必要です。
- スクリプト内で使用している変数に期待する値が格納されているか確認します。スクリプト内に
echo
やprint
文を挿入して、変数の値や実行フローを出力させるのが効果的なデバッグ手法です。 - ターミナルでの手動実行: ビルドログから取得したスクリプトコマンド(
/bin/sh -c ...
の部分など)をコピーし、プロジェクトのルートディレクトリにターミナルで移動した状態で手動で実行してみます。これにより、より詳細なエラーメッセージが表示されたり、対話的にデバッグしたりできます。ただし、Xcodeのビルド環境と全く同じ環境を再現するのは難しい場合もあります(特に環境変数)。
原因 3: 依存関係マネージャ(CocoaPods, Carthageなど)の問題
説明: CocoaPodsのインストールが不完全、Podfile/Cartfileの記述ミス、Podfile.lock/Cartfile.resolvedと実際のライブラリの状態の不整合、あるいはPods/Carthageが生成するスクリプト自体に問題がある場合に発生することが非常に多いです。
ビルドログには、CocoaPods関連のスクリプト(例: [CP] Embed Pods Frameworks
, [CP] Copy Pods Resources
)の名前が表示され、その後にPodコマンドや関連するツールのエラーメッセージが続きます。Carthageの場合は、carthage copy-frameworks
などのエラーが表示されます。
詳細な対処法:
-
基本のクリーンアップと再インストール:
- Clean Build Folder: XcodeのProductメニューから「Clean Build Folder」(
Shift + Command + K
)を実行します。これにより、古いビルドファイルが削除されます。 - Derived Dataの削除: XcodeのProductメニュー > Clean Build Folder だけでは不十分な場合があります。Xcodeの環境設定(PreferencesまたはSettings) > Locationsタブを開き、Derived Dataのパス(通常は
~/Library/Developer/Xcode/DerivedData
)を確認します。そのパスをFinderで開き、プロジェクト名の付いたフォルダや、Derived Dataフォルダ全体を削除します。 - Pod/Carthage関連ファイルの削除:
- CocoaPodsの場合: プロジェクトルートディレクトリにある
Podfile.lock
ファイルとPods
ディレクトリを削除します。プロジェクト名.xcworkspace の横にある プロジェクト名.xcodeproj を右クリックして「Trash」を選択し、Xcodeからプロジェクトファイルを削除します。(注:これは.xcodeproj
ファイル自体をディスクから削除するのではなく、Xcodeのワークスペースからの参照を削除する操作です)。 - Carthageの場合: プロジェクトルートディレクトリにある
Cartfile.resolved
ファイルとCarthage
ディレクトリを削除します。
- CocoaPodsの場合: プロジェクトルートディレクトリにある
- 依存関係の再インストール:
- CocoaPodsの場合: ターミナルでプロジェクトルートディレクトリに移動し、
pod install
コマンドを実行します。完了したら、Xcodeで.xcworkspace
ファイルを開き直します(.xcodeproj
ではなく.xcworkspace
を開くことが重要です)。 - Carthageの場合: ターミナルでプロジェクトルートディレクトリに移動し、
carthage update --platform iOS
(または必要に応じてmacOS, watchOS, tvOSなどを追加) コマンドを実行します。完了したら、Xcodeのプロジェクト設定でCarthageフレームワークが正しくリンクされているか確認します。
- CocoaPodsの場合: ターミナルでプロジェクトルートディレクトリに移動し、
- Clean Build Folder: XcodeのProductメニューから「Clean Build Folder」(
-
Podfile/Cartfileの確認:
Podfile
またはCartfile
にシンタックスエラーがないか確認します。- 指定しているライブラリのバージョンに問題がないか確認します。特定のライブラリのバージョンが、他のライブラリやXcodeのバージョンと互換性がない場合があります。
- もしCocoaPodsを使っているなら、ターゲット設定が正しく行われているか(特にUse frameworks! が含まれているかなど)確認します。
-
Podターゲットのビルド設定確認 (CocoaPods):
- CocoaPodsは、
pod install
実行時にPods.xcodeproj
を生成します。このプロジェクト内にも各Podライブラリのターゲットが存在し、独自のビルド設定を持っています。 - 稀に、これらのPodターゲットのビルド設定(例: Build Settings > Code Signing, Build Active Architecture Onlyなど)がプロジェクトのメインターゲットの設定と競合して問題を引き起こすことがあります。
Pods.xcodeproj
を開き、エラーに関連していると思われるPodターゲットのビルド設定を確認します。ただし、Podファイルのカスタマイズなどで特別な理由がない限り、これらの設定を手動で変更することは避けるべきです。問題が発生した場合は、pod install
のやり直しで解決することが多いです。
- CocoaPodsは、
-
古いPodファイルなどが残っていないか確認 (CocoaPods):
- プロジェクトファイルを Gitなどで管理している場合、
.gitigonre
にPods/
,Podfile.lock
,プロジェクト名.xcworkspace
などが含まれていることが多いですが、稀にこれらのファイルが意図せず残っていたり、クリーンアップが不完全だったりすることがあります。前述の「基本のクリーンアップ」手順を正確に行います。
- プロジェクトファイルを Gitなどで管理している場合、
原因 4: 環境の問題 (PATH, Shell, Xcode version, Command Line Tools)
説明: Xcodeが実行されるシステム環境、特にPATH環境変数や使用されるシェル、あるいはXcode自体のバージョンやCommand Line Toolsの設定に問題がある場合にエラーが発生することがあります。これは原因1と重なる部分がありますが、より広範な環境設定の問題を指します。
ビルドログには、使用されたシェルや環境変数に関する情報が出力されていることがあります。
詳細な対処法:
- Xcodeの再起動: 一時的な問題である可能性もあるため、まずはXcodeを完全に終了し、再起動してみます。
- Macの再起動: システム全体の環境設定の変更などが、Xcodeに正しく反映されていない可能性があります。Macを再起動してみます。
- PATH環境変数の再確認: 原因1で述べたように、Xcodeのビルド環境のPATHはターミナルと異なる可能性があります。必要なコマンドへのパスがPATHに含まれているか、スクリプト内で適切にPATHを設定しているか再確認します。特に
/usr/local/bin
,/opt/homebrew/bin
, RVM/rbenvなどのRuby環境のパスなどが重要になることが多いです。 - シェルの設定: Run ScriptのShell設定(Build Settings > Shell)が、スクリプトのShebang (
#!/bin/sh
など)と一致しているか確認します。特定のシェル機能(例: bashism, zshism)に依存したスクリプトを使用している場合は、そのシェルがXcodeで実行可能であるか確認し、Build Settingsで明示的に指定します。 - Xcodeバージョンの確認:
- プロジェクトが要求するXcodeバージョンを使用しているか確認します。特にSwiftのバージョンはXcodeのバージョンに強く依存するため、非互換性が問題を引き起こすことがあります。
- 使用しているXcodeバージョンに既知のバグがないか、Apple Developerサイトや開発者コミュニティで情報を探します。最新バージョンで問題が起きる場合、一つ前の安定版を試してみることも検討します(複数のXcodeバージョンをインストールし、
xcode-select
コマンドで切り替えて使用できます)。
- Command Line Toolsの確認: Xcodeの環境設定 > Locationsタブ > Command Line Tools で、現在使用しているXcodeバージョンに対応した適切なCommand Line Toolsが選択されているか確認します。稀にこれが原因で、
git
やその他の開発ツール関連のコマンドが見つからなくなることがあります。必要に応じて、ドロップダウンメニューから正しいバージョンを選択し直します。
原因 5: プロジェクトのBuild Phases設定の問題
説明: XcodeプロジェクトのBuild Phasesタブで、Run Scriptフェーズの設定自体に誤りがある場合です。スクリプトコードの記述ミスだけでなく、Input FilesやOutput Filesの指定が不正確な場合も問題を引き起こすことがあります。
ビルドログには、Run Scriptフェーズの名前と、それに続くスクリプトの実行結果が出力されます。Input/Output Filesの問題の場合、それらが原因でスクリプトがスキップされたり、キャッシュが無効になったりして問題が発生することがあります。
詳細な対処法:
- Build Phases > Run Script の設定を確認する:
- プロジェクトナビゲーターでプロジェクトを選択し、ターゲットを選択します。
- 「Build Phases」タブを開き、エラーが発生したPhaseScriptExecutionに対応するRun Scriptフェーズを見つけます(通常、CocoaPods関連であれば名前で分かります)。
- スクリプトコードの確認: Run Scriptボックス内のスクリプトコードに、前述のシンタックスエラーや論理エラーがないか再確認します。
- Shellの確認: スクリプトボックスの下にあるShellのドロップダウンメニューで、使用したいシェル(
/bin/sh
,/bin/bash
,/bin/zsh
など)が正しく選択されているか確認します。 - Input Files / Output Files の確認: Run Scriptフェーズには、スクリプトの入力となるファイル(Input Files)や、スクリプトが生成する出力ファイル(Output Files)を指定する欄があります。
- これらの指定は、Xcodeがビルドの依存関係を管理し、Incremental Build(変更がない部分はビルドをスキップする機能)を適切に行うために重要です。
- 指定が不正確な場合(例: 存在しないファイルをInputに指定している、生成されないファイルをOutputに指定しているなど)が問題の原因となることがあります。
- トラブルシューティングとして: 一時的にInput FilesとOutput Filesのリストを空にしてビルドを試してみるのも有効です。これにより、Incremental Buildの不具合が原因かどうかを切り分けられます。ただし、恒久的な解決策としては、正確なInput/Outputファイルを指定し直す必要があります。
- ファイルパスはプロジェクトルートからの相対パスで記述します。
- Show environment variables in build log: Run Scriptフェーズの設定の下部にある「Show environment variables in build log」にチェックを入れると、ビルドログにスクリプト実行時の環境変数リストが出力されます。これにより、PATHなどがどのように設定されているかを確認でき、デバッグに役立ちます。
原因 6: リソースやファイルの不足/競合
説明: スクリプトが特定のファイルやリソースを処理しようとした際に、そのファイルが見つからなかったり、複数の場所で同じファイルが異なる方法で扱われようとして競合したりする場合です。CocoaPodsの Copy Pods Resources
スクリプトなどで、Podのリソースファイルが見つからない場合などに発生し得ます。
ビルドログには、見つからなかったファイルパスや、コピーまたは処理に失敗したファイル名が表示されることが多いです。
No such file or directory: [ファイルパス]
failed to copy [ファイル名]
詳細な対処法:
- エラーログに示されたファイルパスを確認する: ビルドログに表示されているファイルパスが、実際にプロジェクト内に存在するか、パスが正しいかを確認します。パスはプロジェクトルートからの相対パスであることが多いです。
- ファイルの存在と場所を確認する: Finderなどで該当ファイルが存在するか確認します。もし見つからない場合は、ソース管理(Gitなど)でファイルが正しく追加されているか、またはPod/Carthageのインストールが正しく行われているか(もしそれがライブラリのリソースなら)確認します。
- Target Membershipの確認: そのファイルがビルド対象のターゲットに正しく含まれているか、プロジェクトナビゲーターでファイルを選択し、右側のFile Inspectorで「Target Membership」を確認します。
- Copy Bundle Resourcesの確認: Build Phasesタブの「Copy Bundle Resources」フェーズを確認します。エラーに関連するリソースファイルがリストに含まれているか、重複して追加されていないか確認します。
- Git LFSなどの影響: Git Large File Storage (LFS) を使用している場合、バイナリファイルが正しくダウンロードされていないと、ビルドスクリプトがそのファイルを処理できずに失敗することがあります。プロジェクトルートで
git lfs pull
を実行して、LFS管理下のファイルが全てダウンロードされているか確認します。
原因 7: 署名関連 (Code Signing)
説明: 特にCocoaPodsの Embed Pods Frameworks
スクリプトなど、フレームワークをアプリケーションバンドルに埋め込む処理を行う際に、コード署名に関する問題が発生し、スクリプトが失敗することがあります。無効な証明書やプロビジョニングプロファイル、Bundle Identifierの不一致、キーチェーンの問題などが原因で、署名または検証に失敗します。
ビルドログには、署名ツール(codesign
)からのエラーや、関連するメッセージが表示されることがあります。
Code Signing Error
Command CodeSign failed with a nonzero exit code
(PhaseScriptExecutionとは別のCodeSignフェーズのエラーですが、原因が関連していることがあります)Provisioning profile "[プロファイル名]" doesn't include signing certificate "[証明書名]"
"[Bundle Identifier]" doesn't match the provisioning profile "[プロファイル名]"
詳細な対処法:
- Code Signing設定の確認:
- プロジェクト設定(Project)と各ターゲット(Target)のBuild Settingsを開き、
Code Signing Identity
とProvisioning Profile
の設定が正しいか確認します。 - 特に、DebugビルドとReleaseビルドで異なる設定になっている場合があるので、ビルドしようとしている構成の設定を確認します。
- CocoaPodsを使用している場合は、
Pods
プロジェクト内の各PodターゲットのCode Signing設定も確認します。通常、pod install
がこれらの設定を自動で適切に行いますが、稀に問題が発生することがあります。
- プロジェクト設定(Project)と各ターゲット(Target)のBuild Settingsを開き、
- Automatically manage signing を活用する: 可能であれば、GeneralタブのSigningセクションで「Automatically manage signing」を有効にし、適切なTeamを選択します。これにより、Xcodeが証明書とプロファイルを自動で管理してくれます。手動で設定している場合は、設定が複雑になりミスが発生しやすいため、自動管理への切り替えを検討します。
- 証明書とプロファイルの有効性確認:
- Apple Developerアカウントポータルにログインし、使用しているDevelopment/Distribution証明書とプロビジョニングプロファイルが有効期限切れになっていないか、デバイスが登録されているかなどを確認します。
- Xcodeの環境設定 > Accountsタブで、Apple IDを選択し、「Manage Certificates…」ボタンや「Download Manual Profiles」ボタンから、証明書やプロファイルの状態を確認・更新できます。
- Keychain Accessの確認:
- 証明書やそれに対応する秘密鍵が、Macの「キーチェーンアクセス」アプリケーションに正しくインストールされているか確認します。ログインキーチェーンやシステムキーチェーンに、有効な証明書と秘密鍵(秘密鍵のアイコンが表示されている)が存在する必要があります。
- 問題がある場合は、Apple Developerアカウントから証明書を再ダウンロードしてインストールし直します。
- Clean and Rebuild: Code Signing設定を変更した後は、必ずクリーンビルド(Cmd + Shift + K)とDerived Dataの削除を行ってからビルドします。古い署名情報がキャッシュされていると、新しい設定が反映されないことがあります。
原因 8: ストレージ容量またはメモリ不足
説明: ビルドプロセス、特にスクリプトの実行中に一時ファイルを作成したり、多くのメモリを使用したりすることがあります。Macのストレージ容量が不足している場合や、同時に多くのアプリケーションを起動していてメモリが圧迫されている場合、スクリプトや関連ツールが正常に動作できずにエラー終了することが稀にあります。
ビルドログには、ディスク容量不足やメモリ割り当てエラーを示す直接的なメッセージが出力されることは少ないかもしれませんが、他の原因に当てはまらない場合に検討すべき要因です。
詳細な対処法:
- ディスク容量の確認: Macのストレージ空き容量を確認します(メニュー > このMacについて > ストレージ)。Xcodeプロジェクトのビルドには数GB以上の空き容量が推奨されます。
- 不要なファイル、アプリケーション、特に過去のXcodeバージョンやDerived Dataフォルダ内の古いビルドファイルなどを削除して容量を確保します。前述のDerived Data削除もこれに含まれます。
- メモリ使用量の確認: アプリケーション > ユーティリティ > アクティビティモニタを開き、メモリタブで現在のメモリ使用量を確認します。Xcodeや、ビルド中に実行されるプロセス(swift, clang, sourcekittenなど)が大量のメモリを消費している可能性があります。ビルド中は、他のメモリを大量に消費するアプリケーションを終了することを検討します。
原因 9: Xcodeの不具合またはプロジェクトファイルの破損
説明: ごく稀に、使用しているXcodeバージョン自体のバグや、プロジェクトファイル(.xcodeproj
や .xcworkspace
)の一部が破損していることが原因で、スクリプト実行フェーズが異常終了することがあります。
この場合、ビルドログには特定の原因を示す明確なエラーメッセージが見当たらないか、一般的なI/Oエラーや内部エラーのようなメッセージが表示されることがあります。
詳細な対処法:
- Xcodeの再起動: 一時的なグリッチの場合、Xcodeを再起動するだけで問題が解決することがあります。
- Macの再起動: これも同様に、システムレベルの一時的な問題を解消するのに役立ちます。
- Xcodeの再インストール: Xcode自体に問題がある可能性がある場合、App StoreからXcodeを再ダウンロードしてインストールし直します。App Store以外からダウンロードした場合は、公式サイトから最新版または適切なバージョンをダウンロードし直します。
- プロジェクトファイルのクリーンアップ:
.xcodeproj
や.xcworkspace
ファイルの内部に一時的なファイルやキャッシュが残っている場合に問題を起こすことがあります。プロジェクトを閉じた状態で、.xcodeproj
ファイルを右クリックし「パッケージの内容を表示」を選択します。表示されるフォルダの中に、xcuserdata
フォルダやproject.xcworkspace/xcuserdata
フォルダがあれば削除します。ただし、これは注意して行う必要があります。 - Gitを活用したプロジェクトファイルの復元: Gitなどのバージョン管理システムを使用している場合、プロジェクトファイルが破損している可能性を考慮し、正常にビルドできていた過去のコミット時点のプロジェクトファイルをチェックアウトして試してみることも有効です。
- 異なるXcodeバージョンの試用: 可能であれば、一つ前の安定版のXcodeや、次のベータ版のXcode(Apple Developerサイトからダウンロード可能)をインストールし、そちらでプロジェクトを開いてビルドを試してみます。
xcode-select -s [Xcodeのパス]
コマンドで、使用するXcodeのバージョンを切り替えられます。 - Appleへのバグレポート: 明らかにXcodeのバグと思われる挙動(他の原因に全く当てはまらず、特定のXcodeバージョンでのみ発生するなど)の場合は、Feedback Assistantを通じてAppleに詳細な状況とビルドログを添えてバグレポートを提出することを検討します。
5. 問題解決のための一般的なアプローチとデバッグのヒント
command phasescriptexecution failed with a nonzero exit code
エラーに遭遇した場合、原因特定と解決に向けて体系的に取り組むための一般的なアプローチを以下に示します。
- 慌てない、エラーメッセージを冷静に読む: エラーメッセージは呪文ではなく、問題解決のための重要な手がかりです。特にビルドログ内の具体的なメッセージを読み飛ばさないことが重要です。
- ログを徹底的に読む、キーワードを探す: 何度も強調しているように、ビルドログは宝庫です。エラーメッセージ、警告、実行されたコマンド、標準出力、標準エラー出力を丹念に確認し、「error」「failed」「No such file」「Permission denied」「command not found」「exit code」などのキーワードを探します。
- 一度に一つの対処法を試す: 原因候補が複数考えられる場合でも、一度に複数の設定変更やファイルを削除するのではなく、一つの変更を加えるたびにビルドを試すようにします。これにより、どの変更が問題解決に効果があったのか、あるいは逆に問題を悪化させてしまったのかを明確に特定できます。
- クリーンビルドとDerived Dataの削除を頻繁に行う: 特にビルド設定やファイル構成を変更した場合、または依存関係マネージャ関連の作業を行った後は、必ずクリーンビルドとDerived Dataの削除を実行します。これは、Xcodeのキャッシュや一時的なビルドファイルが原因で発生する問題を排除するために非常に効果的です。
- プロジェクトのバックアップ: 重要な設定変更を行ったり、Derived Data以外のプロジェクトファイル(例:
.xcodeproj
のパッケージ内容)を操作したりする前には、プロジェクトフォルダ全体のバックアップを取っておくと安心です。 - Gitの活用: Gitを使用している場合、現在の変更を一旦
git stash
で退避させるか、あるいは一時的にコミットしてから問題解決に取り組み始めると、変更の管理が容易になります。また、git bisect
コマンドを使って、正常にビルドできていた過去のコミットと現在ビルドできないコミットの中間点を繰り返しテストすることで、問題が発生し始めた特定のコミットを特定できる場合があります。これにより、そのコミットに含まれる変更(例えば特定のライブラリの追加、ビルド設定の変更、スクリプトの追加など)が原因である可能性が高いと絞り込めます。 - ターミナルでの手動実行: ビルドログから取得したスクリプトコマンドを、プロジェクトルートディレクトリでターミナルから手動で実行してみます。Xcodeのビルド環境を完全に再現できるわけではありませんが、スクリプト自体のシンタックスエラーや、特定のコマンドが実行可能かどうかの確認に役立ちます。実行する際は、XcodeのBuild Settings > Run Script で「Show environment variables in build log」をオンにして、環境変数を確認し、ターミナルセッションで同様の環境(特にPATH)を再現するよう努めると、より正確なテストができます。
- コミュニティやドキュメントの活用: ビルドログに表示された具体的なエラーメッセージや、特定のPod/Carthage関連のスクリプト名などをキーワードにして、Google検索やStack Overflow、GitHubの該当ライブラリのIssueページなどを検索します。同じ問題に遭遇した他の開発者が、既に解決策や回避策を見つけている可能性があります。CocoaPodsやCarthageの公式ドキュメントも参照すると良いでしょう。
- 問題を切り分ける: プロジェクト全体のビルドがエラーになるのか、特定のターゲットのみか、特定の構成(Debug/Release)のみかなどを確認し、問題の範囲を絞り込みます。また、PhaseScriptExecution以外のビルドフェーズでエラーが出ていないかも確認します。
6. まとめと予防策
command phasescriptexecution failed with a nonzero exit code
エラーは、Xcodeのビルドスクリプトが正常に終了しなかったことを示す、一般的なエラーです。その原因は、スクリプト自体の問題、依存関係マネージャの問題、環境設定、プロジェクト設定など、多岐にわたります。
このエラーに遭遇した際の最も重要な対処法は、Xcodeのビルドログを徹底的に確認し、エラーメッセージや警告から具体的な原因のヒントを得ることです。ログに示された情報をもとに、本記事で解説したような主要な原因カテゴリ(コマンドの欠如/権限不足、スクリプト内部エラー、依存関係マネージャ問題、環境問題、プロジェクト設定問題、ファイル不足、署名問題、リソース問題など)の中から可能性のあるものを特定し、それぞれの詳細な対処法を一つずつ試していくことが問題解決への近道です。
問題を効率的に解決するためには、一度に一つの変更だけを加え、変更を加えるたびにクリーンビルドとDerived Data削除を行った後にビルドを試すという体系的なアプローチが非常に有効です。また、Gitを活用して変更履歴を管理し、必要に応じて過去の安定した状態に戻れるようにしておくことも重要です。
将来的にこの種のエラーに遭遇するリスクを減らすためには、以下の予防策を心がけることが有効です。
- 依存関係マネージャの定期的なメンテナンス: CocoaPodsやCarthageなどのライブラリは定期的にアップデートし、不要になったライブラリは削除するなど、依存関係を整理します。
- カスタムビルドスクリプトの記述に注意: Run Scriptフェーズにカスタムスクリプトを追加する場合は、シェルスクリプトの基本的な文法を理解し、エラーハンドリング(例:
set -e
でエラー発生時にスクリプトを停止させる)を考慮に入れます。複雑なスクリプトは外部ファイルとして管理し、バージョン管理下に置きます。 - 環境変数の管理: ビルドスクリプト内で外部コマンドを使用する場合、PATH環境変数に依存するのではなく、スクリプトの冒頭で必要なパスを明示的に追加するなど、Xcodeのビルド環境に依存しないように記述することを検討します。
- Xcodeおよび関連ツールのアップデートは慎重に: XcodeやCocoaPods、Carthageなどの重要なツールをアップデートする際は、リリースノートを確認し、既知の互換性問題がないか確認します。大規模なプロジェクトやチーム開発では、一度に全員がアップデートするのではなく、一部のメンバーから試すなどの段階的なアプローチを検討します。
- クリーンな開発環境の維持: 定期的にDerived Dataフォルダを削除したり、システム上の不要なファイルを整理したりして、開発環境をクリーンに保ちます。
command phasescriptexecution failed with a nonzero exit code
エラーは、一見すると難解に感じられるかもしれませんが、その本質は「特定のスクリプトが期待通りに実行されなかった」という比較的シンプルなものです。ビルドログという強力な手がかりを最大限に活用し、体系的に原因を探求することで、必ず解決の糸口は見つかります。
この詳細な解説が、あなたが次にこのエラーに遭遇した際に、冷静かつ効率的に問題解決に立ち向かうための助けとなれば幸いです。
7. 免責事項
本記事は、Xcodeビルドにおける command phasescriptexecution failed with a nonzero exit code
エラーに関する一般的な原因と対処法について詳細に解説したものですが、プロジェクトの具体的な構成、使用しているライブラリ、Xcodeのバージョン、macOSのバージョン、システム環境など、様々な要因によってエラーの原因や適切な対処法は異なります。
したがって、本記事の情報はあくまで参考としていただき、実際の開発においては、ご自身のプロジェクトの状況やビルドログの内容を最優先に判断し、慎重に作業を進めてください。重要な設定変更やファイル削除を行う際は、必ず事前にプロジェクトのバックアップを取得することをお勧めします。