dely Tech Blog

クラシル・TRILLを運営するdely株式会社の開発ブログです

社内ライブラリをSwiftPMに対応させる

TRILL開発部の石田です。

TRILLでは、Swagger Codegenで生成したAPIクライアントライブラリを使ってサーバと通信しています。 このライブラリはGitHubで管理しており、Carthage経由で利用しています。

Xcode11からSwift Package Manager (以下SwiftPM) がサポートされたということで、上記ライブラリをSwiftPMに対応させてみました。

Swagger Codegen製APIクライアントライブラリ

Swaggerは、REST APIを記述するための仕様であり、その仕様からクライアントのライブラリや、サーバのスタブを自動生成するツールがSwagger Codegenです。 TRILLのクライアントアプリでは、Swagger Codegenで生成されたAPIクライアントライブラリを使っています。 iOSのクライアントライブラリは、内部でRxSwiftとAlamofireを使っており、そのためそれらライブラリと依存関係にあります。

SwiftPM対応

SwiftPM対応は、 Package.swift がルートディレクトリに存在し、GitHubなどのリモートリポジトリ経由でライブラリが参照できれば完了です。 Package.swift は以下のコマンドを実行することで生成されます。

$ cd MyPackage
$ swift package init

生成された Package.swift を必要に応じて編集します。 上述の通りRxSwiftとAlamofireと依存関係にあるので、 dependencies の部分に記載します。 また path の部分も必要に応じて編集します。

// swift-tools-version:5.2
import PackageDescription

let package = Package(
    name: "API",
    platforms: [
      .iOS(.v11)
    ],
    products: [
        .library(name: "API", targets: ["API"])
    ],
    dependencies: [
        .package(url: "https://github.com/ReactiveX/RxSwift.git", from: "5.1.1"),
        .package(url: "https://github.com/Alamofire/Alamofire.git", from: "4.9.1")
    ],
    targets: [
        .target(
            name: "API",
            path: "Source/Path",
            dependencies: [
                "RxSwift",
                "Alamofire"
            ]
        )
    ],
    swiftLanguageVersions: [.v5]
)

Package.swift の編集が完了したら、ビルドをします。

$ swift build

Package.resolved が生成されると思います。 これらファイルをまとめてGitHubなどにアップロードします。

Xcodeからの利用

Xcodeのメニューから、File → Swift Package → Add Package Dependency... から上記のライブラリを追加します。 プライベートリポジトリの場合は認証を必要としますが、GitHubのアカウント情報を入力すればダウンロードができます。

まとめ

Carthageで管理している社内ライブラリをSwiftPM対応しました。 Xcode公式のパッケージ管理ツールなので、信頼感がありますし、ソースコードもXcodeから確認することができるので便利に利用することができます。

しかし、Carthageのように事前のビルドがないため、クリーンビルドには時間がかかってしまいます。 そのため、最終的にはSwiftPM移行を諦め、現在はCarthageでの管理を行っています。 こちらに関しては、Xcode 12/Swift 5.3で対応したBinary Frameworkに期待したいと思います。