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に期待したいと思います。