[Swift 3.0][導入編] Swift Package Manager を試してみました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Swift Package Manager

こんにちは!
モバイルアプリサービス部の田中孝明です。

2015年12月以降、SwiftがOSSになってからエコシステムが変わりつつあります。
Swift Package Managerというライブラリ管理ツールが新たに追加されました。
Swift Package Managerに関してはSwiftの公式のドキュメントのPackage Managerの項目にて詳しく記載されていますので、こちらを数回に分けて解説したいと思います。

Swiftのライブラリ管理

iOSにおけるライブラリ管理ツールはCocoaPodsCarthageが馴染み深かったのではないでしょうか?
ただし、いずれもmacOSでしか動作しません。
Swift Package ManagerUbuntuでも動作するため、Swiftをサーバーサイドで動作させる際に強力なライブラリ管理ツール隣ます。
今回は導入編ということで、サーバーサイドでOSSのライブラリを組み込むところまでやってみたいと思います。

Himotoki

JSONデコードライブラリのHimotokiSwift Package Managerに対応しています。
ライブラリ配下にPackage.swiftファイルがあるのもその特徴です。

import PackageDescription

let package = Package(
    name: "Himotoki"
)


記載されている内容に関しては別の回でまとめたいと思います。

Perfect

Server Side Swiftのframeworkの一つであるPerfectはバージョン2.0にてSwift Package Managerのフルサポートが追加されました。
今回はこちらのframeworkを使用します。

ライブラリのインポート

Perfect配下のPackage.swiftファイルのdependenciesにフォーマットに従ってライブラリのURLを追加します。

let package = Package(
    name: "PerfectTemplate",
    targets: [],
    dependencies: [
            .Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", versions: Version(0,0,0)..<Version(10,0,0)), 
            .Package(url: "https://github.com/ikesyo/Himotoki.git", versions: Version(0,0,0)..<Version(10,0,0))
    ]
)


.PackageurlにはライブラリのgitのURLを入力します。
versionsには取り込むライブラリのバージョンを記載します。

ライブラリの指定が終われば、あとはswift buildコマンドを実行することで、ライブラリがプロジェクトに組み込まれます。

$ swift build


ビルドが成功すると、組み込まれたライブラリを使用することができます。

struct Message: Decodable {
    let id: String?
    let message: String
    let created_at: String
    let updated_at: String

    // MARK: Decodable
    static func decode(_ e: Extractor) throws -> Message {
        return try Message(
            id: e <|? "id",
            message: e <| "message",
            created_at: e <| "created_at",
            updated_at: e <| "updated_at"
        )
    }
}


まとめ

今回はHimotokiを試行させていただきましたが、他のライブラリも徐々にではありますがSwift Package Managerに対応しつつあります。
今後のライブラリ選定の基準としてCocoaPodsCarthageSwift Package Managerの全てに対応していることが条件となってくるのでは無いでしょうか?

参考文献

Package Manager

Swift Package Manager Project