自分で作ったSwiftライブラリをCocoapodsにする手順メモ


はじめに
======

[CocoaPods の Swift ライブラリを使えるようにする](http://ez-net.jp/article/B6/KGWBSQRK/pKRKJIwa7Xdz/)などでも紹介されているように、
最近CocoapodsもSwift対応がなされており、Alamofire のような有名なライブラリなども対応されてきました。

なので、自分で作ったSwiftライブラリもCocoapods化していきたいと思ったのですが、いろいろ躓いたのでその手順メモです。

まだCocoapodsのSwift対応も完全ではないので、今後手順も変わるかもしれませんが、現状の参考までに。

準備
======

Swift対応のCocoapodsは現時点(2014/12/24)本流のBranchにはMergeされていないので、Swift対応のCocoapods環境から準備します。
[CocoaPods の Swift ライブラリを使えるようにする](http://ez-net.jp/article/B6/KGWBSQRK/pKRKJIwa7Xdz/)などでも紹介されているように、適当なLocalディレクトリに Bundlerなどで入れておくといいのではないかと思います。

Cocoapodsの準備
-----------

今回はこんな感じに pods ディレクトリを作ってそこに入れておきます。

```bash
% mkdir pods
% cd pods
# create Gemfile
% bundle install --path vendor/bundle
```

Gemfileはこうしておきます。

```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のコマンドでひな形を作ります。

```bash
% 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ですが、おそらく

```DeepTransition.podspec
s.source_files = 'Pod/Classes/**/*.swift'
```

は書かないといけないんじゃないかと思います。

pod lintしてみる
-----------

```
% bundle exec pod lib lint DeepTransition.podspec 
```

などで確認できます。

デモプロジェクトを作る
===========

動作確認用のデモプロジェクトは大事ですので、作っておきます。
現在作られるデモプロジェクトのひな形は ObjectiveCベースのものなので、一旦作りなおすことにします。
＃ あれ、じゃあ、最初の質問にデモプロジェクト要らないってこたえるべきか。。。

```bash
% rm -rf Example
```

してから、普通にXcodeでSwiftベースのProjectを作成します。
その後、Projectを閉じて、通常Cocoapodsを使うときのように Podfileを作ります。
その際に、自作ライブラリへの参照は :path を使うと少し楽？です。こんな感じになりました。

```ruby:Example/Podfile
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 してみます。

```bash
% cd Example
% bundle exec pod install 
```

これで InstallされればOKです。

Cocoapods本体にPushする
===========
###[修正:2014/12/25]

以前はPull Requestを送る形式で取り込んでもらっていましたが、最近では
[CocoaPods Trunkを利用したライブラリの追加方法](http://blog.hypermkt.jp/cocoapods-trunk%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E8%BF%BD%E5%8A%A0%E6%96%B9%E6%B3%95/)
という方法で行うようです。知らなかった。。。

とても簡単になりました。

CocoaPodsにユーザ登録する
-----------
以下のコマンドで実行すると、メールアドレスに確認メールが来るのでそれをクリックすると登録が完了します。

```bash
% bundle exec pod trunk register mymail@example.com 'My Name'   
```

Pushする
-------

以下のコマンドでPushします。

```bash
% bundle exec pod trunk push DeepTransition.podspec 
```


これだけです！これは捗る！


さいごに
=====

こう振り返ると全然難しいところは無かったですね。
ちょっと躓く度に [Carthage](https://github.com/Carthage/Carthage) にしようか、、と迷っていたから結構時間かかってしまいました。
Cocoapodsでも問題ないならCocoapodsの方がデファクトな分だけ良さそうに思います。