XcodeでSwift Package Manager(SPM)の依存関係を取得・更新するときに、Package resolution failed と表示されてビルドできないことがあります。
このエラーは、依存パッケージのバージョン条件が衝突している場合だけでなく、Gitリポジトリへの接続失敗、認証エラー、キャッシュ破損、Package.resolvedの不整合などでも発生します。
主な原因
- 複数のSwift Packageが要求するバージョン条件が競合している
- Package.resolvedと現在のPackage.swift/Xcode設定が一致していない
- GitHubなどのリポジトリへ接続できない
- プライベートリポジトリの認証情報が不足している
- XcodeのSwift Packageキャッシュが破損している
- 指定したタグ・ブランチ・コミットが削除または変更されている
代表的な発生状況
次のような操作の直後に発生しやすいエラーです。
- 新しいSwift Packageを追加した
- 既存パッケージのバージョン条件を変更した
- Xcodeをアップデートした
- 別のMacやCI環境でプロジェクトを開いた
- Package.resolvedをGitで更新・競合解消した
確認手順
- XcodeのIssue NavigatorでPackage resolution failedの直前に表示されている詳細メッセージを確認します。
- Project NavigatorのPackage Dependenciesで、問題のパッケージ名と要求バージョンを確認します。
- 対象リポジトリURLをブラウザまたはGitで開き、アクセスできるか確認します。
- Package.resolvedに記録されたバージョンやrevisionが現在も存在するか確認します。
解決方法1:パッケージ依存関係を再解決する
XcodeのメニューからFile > Packages > Resolve Package Versionsを実行します。
コマンドラインでは、プロジェクトやワークスペースに応じて次のように再解決できます。
xcodebuild -resolvePackageDependencies -project MyApp.xcodeproj
ワークスペースを使用している場合は次のようにします。
xcodebuild -resolvePackageDependencies -workspace MyApp.xcworkspace -scheme MyApp
解決方法2:Package.resolvedを確認・再生成する
Package.resolvedには依存関係の解決結果が保存されています。内容が古い、または競合解消後に不整合が起きた場合は、バックアップを取ったうえで再解決すると改善することがあります。
チーム開発やCIでは、Package.resolvedを安易に削除しないでください。AppleはCI環境でPackage.resolvedを使って依存関係を固定する運用を案内しています。
解決方法3:Swift Packageキャッシュをリセットする
XcodeのFile > Packages > Reset Package Cachesを実行し、その後に再度Resolve Package Versionsを実行します。
DerivedDataの破損も疑われる場合は、Xcodeを終了してから不要なDerivedDataを削除し、再ビルドします。
rm -rf ~/Library/Developer/Xcode/DerivedData/*
解決方法4:パッケージのバージョン条件を見直す
2つ以上の依存パッケージが同じライブラリの異なる非互換バージョンを要求している場合、解決に失敗します。XcodeのPackage Dependenciesから各パッケージのDependency Ruleを確認し、互換性のある範囲へ調整します。
Package.swiftでは、たとえば次のような指定を確認します。
.package(url: "https://github.com/example/Library.git", from: "2.0.0")
解決方法5:Git接続と認証を確認する
プライベートリポジトリの場合は、SSHキーやアクセストークンなどの認証設定が必要です。SSH接続を使っている場合は、ターミナルでリポジトリへアクセスできるか確認します。
git ls-remote git@github.com:example/private-library.git
CIでxcodebuildを使う場合、環境によってはシステム側のGit設定を使うために次のオプションが有効です。
xcodebuild -resolvePackageDependencies -scmProvider system
解決方法6:存在しないタグ・ブランチ・コミットを確認する
パッケージ側でタグやブランチが削除された場合、以前は解決できていたプロジェクトでも突然失敗することがあります。Package.resolvedやDependency Ruleに記録されたバージョン、ブランチ、revisionがリモートリポジトリに存在するか確認してください。
注意点
- Package.resolvedを削除すると、依存パッケージのバージョンが変わる可能性があります。
- チーム開発では、自分の環境だけで解決した変更をそのままコミットする前に差分を確認してください。
- プライベートパッケージでは、ローカルで成功してもCI側に同じ認証設定がなければ失敗します。
- 一時的なGitホスティングサービス障害やネットワーク障害でもPackage resolution failedが発生します。
まとめ
Xcodeの「Package resolution failed」は、Swift Package Managerが依存関係を確定できなかったことを示すエラーです。まず詳細メッセージを確認し、依存関係の再解決、Package.resolvedの確認、キャッシュのリセット、バージョン条件、Git接続・認証の順に切り分けると原因を特定しやすくなります。
