XcodeでSwift Package Managerの依存関係を読み込む際に「Could not resolve package dependencies」と表示され、ビルドやパッケージ追加が進まないことがあります。このエラーは、バージョン条件の競合、Package.resolvedの不整合、リポジトリへの接続や認証、キャッシュ破損などが原因で発生します。
主な原因
- 複数パッケージのバージョン条件が両立していない
- Package.resolvedの内容と現在の依存関係が合っていない
- パッケージのGitリポジトリへ接続できない
- Private PackageのSSH鍵・認証情報が不足している
- XcodeやSwiftPMのキャッシュが破損している
- 指定したブランチ・タグ・コミットが存在しない
代表的な発生状況
新しいSwift Packageを追加した直後、既存パッケージのバージョンを変更した後、別のMacでプロジェクトを開いた時、CI環境へ移した時、あるいはGit側でタグやブランチ構成が変わった時に発生しやすいエラーです。
確認手順
1. エラー詳細を確認する
XcodeのReport NavigatorやPackage Dependenciesの表示から、どのパッケージで解決に失敗しているか確認します。
2. Package.resolvedを確認する
プロジェクト内のPackage.resolvedに、現在利用したいパッケージのバージョンやリビジョンが記録されているか確認します。
3. リポジトリへ接続できるか確認する
git ls-remote https://github.com/example/package.git
Private Packageの場合は、SSHまたはHTTPS認証が正しく設定されているかも確認します。
解決方法
方法1:Xcodeでパッケージを再解決する
Xcodeの「File」→「Packages」から依存関係の更新・再解決を実行します。軽微なキャッシュ不整合であればこれだけで直ることがあります。
方法2:コマンドラインで依存関係を解決する
xcodebuild -resolvePackageDependencies -project MyApp.xcodeproj
Workspaceを使用している場合は、次のように実行できます。
xcodebuild -resolvePackageDependencies -workspace MyApp.xcworkspace -scheme MyApp
方法3:Package.resolvedを見直す
チーム開発やCIでは、Package.resolvedをGit管理し、全環境で同じ解決結果を使う方法が安定します。内容が古い場合は、依存関係を正しく再解決したうえで更新します。
方法4:バージョン条件の競合を解消する
Package.swiftやXcodeのPackage Dependency設定で、同じ依存ライブラリに対して互換性のないバージョン条件が指定されていないか確認します。
.package(url: "https://github.com/example/library.git", from: "2.0.0")
別パッケージが1.x系を要求している場合などは、互いに満たせるバージョンへ条件を調整する必要があります。
方法5:キャッシュを削除して再取得する
Xcodeを終了したうえでDerivedDataを削除し、再度パッケージ解決を行います。
rm -rf ~/Library/Developer/Xcode/DerivedData/*
必要に応じてXcodeのPackage Cacheのリセットも行います。
方法6:Private Packageの認証を確認する
SSH URLを使用している場合は、鍵とknown_hostsを確認します。
ssh -T git@github.com
CIでxcodebuildを直接使う場合は、SSH設定やknown_hosts、必要な認証情報がCI実行ユーザーで利用できることを確認してください。
方法7:システムGit設定を使う
プロキシ、URL置換、独自SSH設定などMac側のGit設定を利用したい場合は、xcodebuildに次のオプションを追加できます。
xcodebuild -resolvePackageDependencies -scmProvider system -project MyApp.xcodeproj
注意:Package.resolvedを削除すると、許可された範囲内で別バージョンが選択されることがあります。特に本番ビルドやCIでは、単純に削除する前に差分とバージョン条件を確認してください。
CIで発生する場合
CIでは自動解決に任せず、検証済みのPackage.resolvedをリポジトリへコミットして同じ依存バージョンを使う方法が安全です。Xcode CloudでもPackage.resolvedを利用した依存関係の固定が推奨されています。
まとめ
「Could not resolve package dependencies」は、Swift Package Managerが依存関係の組み合わせを確定できない時に発生します。まず失敗しているパッケージを特定し、Package.resolved、バージョン条件、Git接続・認証を確認してください。そのうえでXcodeまたはxcodebuildで再解決し、必要に応じてキャッシュを整理すると、多くのケースを解消できます。
