はじめに
CocoaPods の Swift ライブラリを使えるようにするなどでも紹介されているように、
最近CocoapodsもSwift対応がなされており、Alamofire のような有名なライブラリなども対応されてきました。
なので、自分で作ったSwiftライブラリもCocoapods化していきたいと思ったのですが、いろいろ躓いたのでその手順メモです。
まだCocoapodsのSwift対応も完全ではないので、今後手順も変わるかもしれませんが、現状の参考までに。
準備
Swift対応のCocoapodsは現時点(2014/12/24)本流のBranchにはMergeされていないので、Swift対応のCocoapods環境から準備します。
CocoaPods の Swift ライブラリを使えるようにするなどでも紹介されているように、適当なLocalディレクトリに Bundlerなどで入れておくといいのではないかと思います。
Cocoapodsの準備
今回はこんな感じに pods ディレクトリを作ってそこに入れておきます。
% mkdir pods
% cd pods
# create Gemfile
% bundle install --path vendor/bundle
Gemfileはこうしておきます。
source 'https://rubygems.org'
gem 'cocoapods', :git => 'https://github.com/CocoaPods/CocoaPods.git', :branch => 'swift'
gem 'cocoapods-core', :git => 'https://github.com/CocoaPods/Core.git'
gem 'xcodeproj', :git => 'https://github.com/CocoaPods/Xcodeproj.git'
gem 'claide', :git => 'https://github.com/CocoaPods/CLAide.git'
ちなみに、Bundler で入れたpodのような実行プログラムを使うときには bundle exec
というのを頭に付けないといけません。
bundle list
Install されているVersionはこうなっています。
Gems included by the bundle:
* activesupport (4.2.0)
* bundler (1.5.2)
* claide (0.7.0 b1eccc2)
* cocoapods (0.35.0 b78ef91)
* cocoapods-core (0.35.0 c9c91c5)
* cocoapods-downloader (0.8.0)
* cocoapods-plugins (0.3.2)
* cocoapods-trunk (0.4.1)
* cocoapods-try (0.4.2)
* colored (1.2)
* escape (0.0.4)
* fuzzy_match (2.0.4)
* i18n (0.7.0)
* json (1.8.1)
* minitest (5.5.0)
* molinillo (0.1.2)
* nap (0.8.0)
* netrc (0.7.8)
* open4 (1.3.4)
* thread_safe (0.3.4)
* tzinfo (1.2.2)
* xcodeproj (0.20.2 e95b387)
自作ライブラリ用のPodテンプレートを作る
今回のライブラリ名は DeepTransition です。podのコマンドでひな形を作ります。
% bundle exec pod lib create DeepTransition
...
# 途中の質問をこんな感じで答えておきました
Would you like to provide a demo application with your library? [ Yes / No ]
>
yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
>
specta
Would you like to do view based testing? [ Yes / No ]
> No
What is your class prefix?
> DPT
Cocoapods化する
以降は作成された PodテンプレートDIR以下で作業します。
配布するファイルを置く
今回はSwiftファイルだけなので、 Pod/Classes/*/*.swift
以下にファイルを置きました。
単にコピーするだけです。
DeepTransition.podspec を修正する
説明などは適当に書けばOKですが、おそらく
s.source_files = 'Pod/Classes/**/*.swift'
は書かないといけないんじゃないかと思います。
pod lintしてみる
% bundle exec pod lib lint DeepTransition.podspec
などで確認できます。
デモプロジェクトを作る
動作確認用のデモプロジェクトは大事ですので、作っておきます。
現在作られるデモプロジェクトのひな形は ObjectiveCベースのものなので、一旦作りなおすことにします。
# あれ、じゃあ、最初の質問にデモプロジェクト要らないってこたえるべきか。。。
% rm -rf Example
してから、普通にXcodeでSwiftベースのProjectを作成します。
その後、Projectを閉じて、通常Cocoapodsを使うときのように Podfileを作ります。
その際に、自作ライブラリへの参照は :path を使うと少し楽?です。こんな感じになりました。
source 'https://github.com/CocoaPods/Specs.git'
target 'DeepTransitionExample', :exclusive => true do
pod "DeepTransition", :path => ".."
end
target 'DeepTransitionExampleTests', :exclusive => true do
pod "DeepTransition", :path => ".."
pod 'Specta', '~> 0.2.1'
pod 'Expecta'
end
podとしてInstallしてみる
いつものように pod install してみます。
% cd Example
% bundle exec pod install
これで InstallされればOKです。
Cocoapods本体にPushする
###[修正:2014/12/25]
以前はPull Requestを送る形式で取り込んでもらっていましたが、最近では
CocoaPods Trunkを利用したライブラリの追加方法
という方法で行うようです。知らなかった。。。
とても簡単になりました。
CocoaPodsにユーザ登録する
以下のコマンドで実行すると、メールアドレスに確認メールが来るのでそれをクリックすると登録が完了します。
% bundle exec pod trunk register mymail@example.com 'My Name'
Pushする
以下のコマンドでPushします。
% bundle exec pod trunk push DeepTransition.podspec
これだけです!これは捗る!
さいごに
こう振り返ると全然難しいところは無かったですね。
ちょっと躓く度に Carthage にしようか、、と迷っていたから結構時間かかってしまいました。
Cocoapodsでも問題ないならCocoapodsの方がデファクトな分だけ良さそうに思います。