Slide 1

Slide 1 text

Swift Package Manager binaryTargetのtips potatotips #83 - 2023/7/21

Slide 2

Slide 2 text

自己紹介 島 健人 MedPeerのiOSエンジニア 歩数計アプリを担当しています。

Slide 3

Slide 3 text

担当プロジェクトにCocoaPodsにしか対応していないライブラリを入 れることになりました。 ここでは HogeSDK と呼ばせていただきます。 プロジェクトではCarthageとSPMを使用中。 Carthageの依存も減らしていってSPMに移行したい段階。 今からCococaPodsの導入はちょっと...

Slide 4

Slide 4 text

SPMのリポジトリを作ってどうにかすることに HogeSDKと依存先のライブラリ( DependencyA )はXCFrameworkが公開されていたため、 SPMに binaryTarget で置いてしまえば何とかなるだろうと思ってリポジトリを作ってみま した。

Slide 5

Slide 5 text

let package = Package( name: "HogeSDK", products: [ .library( name: "HogeSDK", targets: [ "HogeSDK" ] ) ], dependencies: [], targets: [ .binaryTarget( name: "HogeSDK", path: "HogeSDK.xcframework" ), .binaryTarget( name: "DependencyA", path: "DependencyA.xcframework" ) ] )

Slide 6

Slide 6 text

依存関係でつまづく binaryTarget には dependency を指定することができず、 Package の dependencies に binaryTarget を書くこともできないため、 このままでは依存関係を解決することができませんでした。

Slide 7

Slide 7 text

Targetを作って依存を解決する SPMのルートディレクトリに HogeSDKTarget というディレクトリを作成して、 HogeSDKTarget.swift というファイルを設置します(中身は空でいいです)。 Package.swift に新規の target を追加して、 HogeSDK と DependencyA どちらも dependencies に記述します。 そしてPackageの products の targets に HogeSDKTarget を記述します。

Slide 8

Slide 8 text

let package = Package( name: "HogeSDK", products: [ .library( name: "HogeSDK", targets: [ "HogeSDKTarget" ] ) ], target: ~ 省略~ .target( name: "HogeSDKTarget", dependencies: ([ .target(name: "HogeSDK"), .target(name: "DepencencyA") ]) ),

Slide 9

Slide 9 text

これで依存関係が解決され、アプリで利用することができるようになりました。 linkerSettings の記載やbundleが必要な場合も同じようにtargetに追加すれば大丈夫で す。

Slide 10

Slide 10 text

まとめ .binaryTarget で取り込んだライブラリに直接 dependencies を書くことはできな い。 依存元と依存先の両方を dependencies に含んだ target を作ることで依存の解決がで きる。 ライブラリによってはこの形式にしてもうまくいかないことがありましたが、条件 がよくわからなかった。 今回のようなケース以外にも、社内ライブラリのSPM対応等で使えると思うので、 依存関係でつまづいた際は試してみるといいかと思います。

Slide 11

Slide 11 text

ありがとうございました!