🛠️

Swift Packageのライブラリを使っているXcodeProjectで依存リストを出力する方法

2022/06/22に公開

事前準備

Homebrewなどでjqコマンドをインストールしておく

SourcePackages/workspace-state.jsonをパースする

Packageの依存解決をすると、DerivedDataの中のSourcePackagesworkspace-state.jsonというファイルが生成されます。この中にSPMで入れたライブラリの情報が格納されています(内容は大体Package.resolvedと同じです)。これをパースすることでライブラリ名とそのバージョンの一覧を出力できます。

cat [SourcePackagesのパス]/workspace-state.json | \ 
jq -r '.object.dependencies[] | .packageRef.name + ":\t" + .state.checkoutState.version'
出力例
BoringSSL-GRPC:	0.9.0
Slash:	
KeychainAccess:	4.2.2
LicenseChecker:	0.1.0
LicenseList:	
nanopb:	0.4.6
ObjectMapper:	4.2.0
PactSwiftToolbox:	
Reachability:	5.1.0
RxSwift:	6.2.0
swift-collections:	1.0.2
Assimp:	2.1.0

プロジェクトのBuild PhasesのRunScriptでこれを行う場合は${BUILD_DIR%Build/*}SourcePackagesでパスを取得できます。
また、Xcode -> Preferences -> Locations -> Derived Data からDerivedDataをFinderで開けます。SourcePackagesのフォルダを選択してOption + Command + Cでフォルダへのパスをコピーできます。

備考:Package.resolvedを参照しない理由

Package.resolvedのJSONオブジェクトの形式はSwift Packageの導入方法やプロジェクトの構成の仕方によって変わるので中の構成を見てみないとjqでのパースの仕方が定りません。
例えば、(1)XcodeのGUIだけでPackageを導入している場合、(2)ローカルPackageの中で外部Packageを導入している場合、(3)(1)と(2)を組み合わせている場合など。なのでPackage.resolvedを参照する場合のjqのパース方法は各自調整してください。

Discussion