🐥

[TIPS]SwiftPMでライブラリが複数ある時のパッケージ導入方法

2021/08/05に公開

背景

先日、swift-collectionsに含まれるOrderedSetを利用する機会がありました。
これまでの経験上、パッケージ名とライブラリ名が同じものばかりを利用しており、パッと導入する方法がわからなかったのでメモ代わりに解決方法を残しておきます。

https://github.com/apple/swift-collections/

問題

下記はswift-collectionsに定義されているPackage.swiftの一部です。
見て分かる通り、productsには複数のライブラリがそれぞれ別々に定義されています。

let package = Package(
  name: "swift-collections",
  products: [
    .library(name: "Collections", targets: ["Collections"]),
    .library(name: "DequeModule", targets: ["DequeModule"]),
    .library(name: "OrderedCollections", targets: ["OrderedCollections"]),
  ]
  // 以下省略
)

解法

例えば、開発しているアプリをDemoAppとし、swift-collectionsに含まれるOrderedCollectionsを利用したい場合は下記のように記述できます。
なお、今回はサンプルコードとしてわかりやすさのために最低限の定義しかしていません。

let package = Package(
  name: "DemoApp",
  dependencies: [
    .package(url: "https://github.com/apple/swift-collections.git", from: "0.0.1"),
  ],
  targets: [
    .target(
      name: "DemoApp", 
      dependencies: [
        .product(name: "OrderedCollections", package: "swift-collections")
      ]
    ),
  ]
)
  • いつも通りdependenciesに利用したいpackageのURLなどを定義する
  • ターゲットのdependenciesnameを指定して追加する

という順序を踏めば正しくライブラリを利用できるようになります。

GitHubで編集を提案

Discussion