[Swift] 自作のパッケージをCocoaPods、Carthage、Swift Package Manager対応させる

自作のSwift製ライブラリをSwiftで用いられる主要なパッケージマネージャー(CocoaPods、Carthage、Swift Package Manager)に対応させるお話です。

環境

Mac OS 10.14.6
Swift 5.0.1
CocoaPods 1.7.1
Carthage 0.33.0

前提

プロジェクトの名前はSwiftyPyStringとします。
以降必要な部分はこれを自身の環境のものと置き換えてください。
また、プロジェクトのルートを./と表します。

Swift Package Manager

色々都合がいいのでプロジェクトをSwift Package Manager(以降SwiftPM)を利用して作成するところから始めます。

適当なディレクトリに移動して、作成したいプロジェクト名のディレクトリを作成します。

mkdir SwiftyPyString
cd SwiftyPyString

作成したディレクトリの中に移動してパッケージを初期化します。

swift package init

こんな具合にファイルが作成されます。

Creating library package: SwiftyPyString
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/SwiftyPyString/SwiftyPyString.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/SwiftyPyStringTests/
Creating Tests/SwiftyPyStringTests/SwiftyPyStringTests.swift
Creating Tests/SwiftyPyStringTests/XCTestManifests.swift

Sources/SwiftyPyString/SwiftyPyString.swiftにプログラムの本体をガリガリ書いていくわけですが、本題ではないので中身については省略します。

Package.swiftが今回の本命です。

import PackageDescription

let package = Package(
    name: "SwiftyPyString",
    products: [
        .library(
            name: "SwiftyPyString",
            targets: ["SwiftyPyString"]),
    ],
    dependencies: [
        // ここに依存パッケージを記述
        // .package(url: /* package url */, from: "1.0.0"),
    ],
    targets: [
        .target(
            name: "SwiftyPyString",
            dependencies: []),
        .testTarget(
            name: "SwiftyPyStringTests",
            dependencies: ["SwiftyPyString"]),
    ]
)

基本的に自動的に作成された状態のままで問題ないですが、依存パッケージがあれば必要に応じてdependencies部分に追記します。

SwiftPMはこの状態でGitHubなどに上げておけば利用できるようになります。

CocoaPods

続いてCocoaPodsへの対応です。
プロジェクトルートで

pod spec create SwiftyPyString

を実行すると、SwiftyPyString.podsecが作成されます。

余計なコメントを消して最低限、以下の内容を書いておけば、だいたいOKです。

Pod::Spec.new do |spec|
  # ライブラリ名
  spec.name         = "SwiftyPyString"
  # バージョン
  spec.version      = "1.0.0"
  # 短い説明
  spec.summary      = "A library that provides Swift with string operations equivalent to Python."
  # 長めの説明
  spec.description  = <<-DESC
  A library that provides Swift with string operations equivalent to Python.
  SwiftyPyString is a string extension for Swift.
  This library provide Python compliant String operation methods.
                   DESC
  # プロジェクトのHP
  spec.homepage     = "https://github.com/ChanTsune/SwiftyPyString"
  # ライセンス
  spec.license      = "MIT"
  # 作者の名前
  spec.author    = "ChanTsune"
  # マルチプラットフォームの場合プラットフォームごとにターゲットのOSのバージョン
  spec.ios.deployment_target = "8.0" 
  spec.osx.deployment_target = "10.10"
  spec.watchos.deployment_target = "2.0"
  spec.tvos.deployment_target = "9.0"
  # プロジェクトのホスト先
  spec.source       = { :git => "https://github.com/ChanTsune/SwiftyPyString.git", :tag => "#{spec.version}" }
  # ソースファイル
  spec.source_files = "Sources/**/*.{swift}"
  spec.requires_arc = true
  # swiftのバージョン
  spec.swift_version = "5.0"

end

この時のバージョン名(spec.version)はあとで、gitのリポジトリにつけるタグと同じでなければならないので覚えておくようにしましょう。

podsecファイルが書けたら以下のコマンドで正しく書けているか確認しましょう。

pod lib lint

特に問題がなければ

SwiftyPyString passed validation.

と表示されます。

ここまで出来たらgitにpushしてタグを付けておきます。

タグは、podsecファイルのバージョンと合わせましょう。

ユーザー登録

pod trunk register "メールアドレス" "名前"
pod trunk me

で登録した情報が確認出来ればOKです。

公開

cocoapodsにpodspecを登録します。

pod trunk push SwiftyPyString.podspec 

Carthage

最後にCarthageへの対応です。

Xcodeのプロジェクトファイルが必要になるので作ります。

swift package generate-xcodeproj

プロジェクトルートで上記コマンドを実行すると、Xcodeのプロジェクトファイルが作成されます。

Xcodeで作成されたプロジェクトファイルを開いて、Manage Schemesからsharedにチェックを入れます。

あとはcocoapods対応の時と同様にgitにタグを付けます。

最後に

以上、自作のライブラリをCocoaPods、Carthage、Swift Package Manager対応させるお話でした。

参考

https://qiita.com/am10/items/9097dd87c4eaa6ec5350