自作ライブラリを CocoaPods で配布できるようにする

iOS/OSX プログラミング - 学習ノート

自分で作ったライブラリに podspec ファイルを用意して、CocoaPods を使って GitHub 経由でインストールできるようにしてみました。

今回の背景

先日にこちら で Swift ライブラリを CocoaPods でインストールする方法についてお話ししたところ、CocoaPods の基本的なところについて教えてもらえる機会に恵まれました。

それを聞いて、なんとなく GitHub と相性が良さそうに感じたのと、自分専用の自作ライブラリもワークスペースでプロジェクトファイルを共有するより CocoaPods で管理した方がもしかしたら運用しやすいかもしれないと思えてきました。


ライブラリだけだと実行時に発生したエラーでソースコードを追うのに苦労したり、修正するのが面倒だったりする印象をかつて覚えたんですよね。

ワークスペースでプロジェクトファイルを共有する方法を取るようになりましたが、この方法だと先述の点は問題なくなるにしても、同じライブラリを使うワークスペースをいくつか開いたときにロックされてしまい、最初の一つだけでしか中身を見れないところが何かと面倒なのでした。

CocoaPods と GitHub なら、もしかすると自分一人で自作プロジェクトを効率良く共有・保守できるかもしれません。これらによってその点が上手く解消できるか分かりませんが、調べてみても今ひとつ実感までたどり着けなかったので、まずは CocoaPods を使って自作ライブラリを利用してみることにしました。

自作プロジェクトを CocoaPods で取り扱う

普通の Git サーバーやローカルリポジトリでも可能なようですが、今回は GitHub にアップロードしたソースコードを CocoaPods でインストールできるようにしてみます。

たとえばローカルリポジトリの場合はfile:///Users/tomohiro/Projects/ESSwim というように、パスを指定することでアクセスできる様子でした。

podspec ファイルを用意する

CocoaPods でソースコードを取り込めるようにするにはpodspec ファイルを作成する必要があります。

このファイルには、ソースファイルをどのリポジトリのどのタグから取り出すかや、そうして指定したポッドの名前や説明、バージョン番号などを記述します。

配布するソースファイルの準備ができてからゆっくり書きたいところですが、今回はこのファイルもソースファイルと同じリポジトリに入れてアップロードしようと思うので、先にこのファイルから作成しておくことにします。

podspec ファイルは、ターミナルでpod spec create ポッド名 を実行することで雛形を作成できます。これを元に必要な項目を調整して、雛形内のコメント行も含めて不要なものは削除することで、比較的簡単にpodspec ファイルを作成できます。


今回は、次のような podspec ファイルを作成してみました。

Pod::Spec.new do |s|

  s.name         = "Swim"
  s.version      = "1.0.0"
  s.summary      = "EZ-NET Standard Swift Module."

  s.description  = <<-DESC
                   It is a swift module that implements basic features.
                   DESC

  s.homepage     = "https://github.com/EZ-NET/ESSwim"

  s.license      = { :type => "MIT", :file => "LICENSE" }

  s.author             = { "Tomohiro Kumagai" => "http://ez-net.jp/profile/" }
  s.social_media_url   = "http://twitter.com/es_kumagai"

  s.ios.deployment_target = "7.0"
  s.osx.deployment_target = "10.9"

  s.source       = { :git => "https://github.com/EZ-NET/ESSwim.git", :tag => "1.0.0" }
  s.source_files  = "ESSwim/**/*.swift"

end

この中でとりわけ注目が必要なのが、次の項目でしょうか。

項目 内容
s.name このライブラリの名前です。インストール時にはこの名前ではなく podspec ファイルに付けたポッド名を指定することになるようです。
s.version このライブラリのバージョン番号です。ただ、今回のように自分の GitHub 経由で配布するときに、このバージョン番号が意味を成すかは分かりませんでした。
s.source ここでソースファイルが保存されているリポジトリの場所を指定します。ここでリポジトリを指定するということは podspec ファイルとソースファイルとが別々のリポジトリに置かれていても良いのでしょう。:git で Git リポジトリの場所を指定して、続く :tag で、その中のどのタグに記録されているものを使うかを指定します。ここでは他にも :branch や :commit といったものでも指定できる様子です。
s.source_files CocoaPods で取り込むファイルを指定します。ここの "**" というのはフォルダー階層の深く先まで探すという意味で、最後の "*.swift" が、拡張子 "swift" のファイルだけという意味になります。

ここでどのようなものが指定できるかはCocoaPods Guides - Podspec Syntax Reference に記されています。

自分の GitHub リポジトリから CocoaPods でインストールしようとしたときに、Podfile でバージョン番号を指定してもA dependency with an external source may not specify version requirements というメッセージが表示され、インストールできない様子でした。

podspec ファイルを配置する

podspec ファイルができたら、それを、そのソースコードを使いたいプロジェクトからアクセスできる場所に保存します。

今回はこれもソースコードと一緒に GitHub へアップロードすることにしようと思うので、配布したいソースコードを含む Xcode プロジェクトのルートディレクトリに保存しておくことにしました。

そしてこれを、ソースファイルと一緒に GitHub へプッシュします。

GitHub に CocoaPods で扱いたいソースファイルを揃える

ソースファイルと podspec ファイルの準備ができたら、GitHub に必要な情報を揃えます。

ソースファイルを GitHub にアップロードする

GitHub に Xcode のプロジェクトを登録する方法は、だいぶ前にObjective-C のサンプルを GitHub にアップしてみる で書いたようにしたことがあったので、今回もその要領でプロジェクトに登録し、アップロードできる準備を整えました。

その上で、普段通りに Xcode の Push 機能を使って、CocoaPods で扱いたいソースコードを GitHub に転送します。

ローカルリポジトリにタグを設定する

ソースコードを GitHub にプッシュしたら CocoaPods での配布に必要な、タグ情報を付加します。

タグ付けは GitHub のRelease の機能からでも付けられそうな様子でしたが、今回はローカルの Git でタグを付けて、それを GitHub へ転送する方法で設定してみます。


リポジトリへのタグ付けは Git コマンドで行います。

ターミナルでプロジェクトのルートディレクトリを開く方法についてはこちら に記載してあります。

プロジェクトのルートディレクトリをターミナルで開いたら、次のようにしてリポジトリにタグを追加します。

git tag -a 1.0.0 -m 'Version 1.0.0'

ここで指定しているオプションの意味は次の通りです。

オプション 意味
-a 1.0.0 注釈付きタグ "1.0.0" を追加します。
-m 'Version 1.0.0' タグに添えるコメントです。ここでは "Version 1.0.0" というテキストをコメントとして添えています。空文字でも良いようです。

注釈付きタグというのは、その時点でのスナップショットを新規オブジェクトとして作成する感じでしょうか。Git には他にも軽量タグという、現在のコミットに別名を付ける軽量タグというのもあるようです。

ローカルリポジトリのタグを GitHub に転送する

ローカルリポジトリへのタグ付けが終わったら、それを GitHub のリポジトリに転送します。

今回はローカルリポジトリに "github" という名前で GitHub がリモートリポジトリとして登録されているものとします。その場合、次のようにして、ローカルリポジトリのタグを GitHub に転送することができました。

git push --tags github master

準備完了

これで、GitHub にアップロードしたソースコードを CocoaPods で取り込む準備が整いました。

最後に、準備した podspec ファイルが正しく設定できているかを、次のコマンドを入力してテストしておくと安心です。

pod spec lint ファイル名

CocoaPods を使って、アップロードしたソースコードを取り込む

それでは CocoaPods を使って、GitHub にアップロードしたソースコードを取り込んでみます。

source 'https://github.com/CocoaPods/Specs.git'

platform :osx, '10.10'
pod 'Swim', :git => "https://github.com/EZ-NET/ESSwim", :tag => '1.0.0'

このようなPodfile を用意して、pod install を実行してみたところ、上記の:git で指定したリポジトリ内にアップロードしたpodspec ファイルに記載したソースファイルをプロジェクトに取り込むことができました。

CocoaPods を使ってライブラリを取り込んでみたときのお話は、CocoaPods を使ってオープンソースのライブラリをプロジェクトで簡単に管理するCocoaPods の Swift ライブラリを使えるようにする。 に記載しています。