最近、Xcode Cloudでワークフローを実行した際に遭遇したエラーについて共有したいと思います。
発生したエラー
Swift Package Dependencies
a resolved file is required when automatic dependency resolution is disabled and should be placed at /Volumes/workspace/repository/⚪︎⚪︎⚪︎.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved. Running resolver because the following dependencies were added: '⚪︎⚪︎⚪︎' (https://github.com/⚪︎⚪︎⚪︎/⚪︎⚪︎⚪︎.git)fatalError
Configuration Issues
Could not resolve package dependencies: a resolved file is required when automatic dependency resolution is disabled and should be placed at /Volumes/workspace/repository/⚪︎⚪︎⚪︎.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved. Running resolver because the following dependencies were added: '⚪︎⚪︎⚪︎' (https://github.com/⚪︎⚪︎⚪︎/⚪︎⚪︎⚪︎.git) fatalError
解決策
この問題を解決するために、以下のスクリプトをプロジェクトのルートディレクトリ内のci_scripts/ci_post_clone.sh
という名前のファイルに書き込みました。
#!/bin/zsh
defaults delete com.apple.dt.Xcode IDEPackageOnlyUseVersionsFromResolvedFile
defaults delete com.apple.dt.Xcode IDEDisableAutomaticPackageResolution
そして、以下のコマンドを使用してスクリプトファイルを実行可能に変更しました。
chmod +x ci_scripts/ci_post_clone.sh
スクリプトが解決した問題
このスクリプトは、Xcodeの設定をリセットすることで、自動的な依存関係解決の挙動を標準状態に戻します。具体的には、XcodeがPackage.resolvedファイルに記述されているバージョンの依存関係のみを使用する設定と、自動的にパッケージ依存関係を解決しようとしない設定を削除します。これにより、Xcodeは再び自動的に依存関係を解決し、ビルドプロセス中に発生する問題を回避することが可能になります。
スクリプトの解説
defaults delete com.apple.dt.Xcode IDEPackageOnlyUseVersionsFromResolvedFile
- このコマンドは、Xcodeの設定 IDEPackageOnlyUseVersionsFromResolvedFile を削除します。
- この設定は、Xcodeが Package.resolved ファイルに記述されているバージョンの依存関係のみを使用するように指示します。
- 設定を削除することで、Xcodeは Package.resolved 以外の情報源からも依存関係の解決を試みることができるようになります。
defaults delete com.apple.dt.Xcode IDEDisableAutomaticPackageResolution
- このコマンドは、 IDEDisableAutomaticPackageResolution 設定を削除します。
- この設定が有効な場合、Xcodeは自動的にパッケージ依存関係を解決しようとしません。
- 設定を削除することで、Xcodeは再び自動的に依存関係を解決しようとします。
補足: ci_scripts/ci_post_clone.shというファイル
がXcode Cloudで自動的に実行される理由
Xcode CloudがCI(Continuous Integration)プロセスの一部として特定のスクリプトを自動的に実行するように設計されているためです。Xcode Cloudには、ビルドプロセス中に特定の段階で自動的に実行される標準的なスクリプトフックがあります。
Writing custom build scripts | Apple Developer Documentation
Xcode CloudのCIプロセスにおけるスクリプトフック
- ポストクローンステージ: レポジトリのクローン作成後、ビルドプロセスの前に実行されるステージです。このステージでは、
ci_post_clone.sh
という名前のスクリプトがあれば自動的に実行されます。 - ファイル名の規約:
ci_post_clone.sh
はXcode Cloudによって認識される特定の名前の規約に従っています。この名前の規約に従うことで、Xcode Cloudは自動的にこのスクリプトを見つけて実行します。
スクリプトの役割
- ビルド環境の設定:
ci_post_clone.sh
スクリプトは、ビルドが実行される前に必要な環境設定や依存関係の解決など、ビルド環境を設定するために使用されます。 - カスタマイズと柔軟性: このスクリプトを使用することで、開発者はビルドプロセスをより細かく制御し、プロジェクトに特有の要件に合わせて環境をカスタマイズできます。
まとめ
ci_scripts/ci_post_clone.sh
というファイル名は、Xcode Cloudのビルドプロセス中に特定のタイミングで自動的に実行されるスクリプトを識別するための規約に基づいています。このスクリプトはビルド環境の設定やカスタマイズに用いられ、Xcode CloudのCIプロセスの柔軟性と効率性を高める役割を果たします。