Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

はじめに

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

DeepTransition.podspec
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 を使うと少し楽?です。こんな感じになりました。

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 してみます。

% 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の方がデファクトな分だけ良さそうに思います。

mokemokechicken
お気楽極楽会社員です。気ままに投稿しています。
sprocket
"Sprocket(スプロケット)は、Webサイトにおけるコンバージョン(購入・入会・資料請求・問合せ等)を増やしたい企業様向けに、自社開発のWeb接客ツールの導入及びコンバージョン改善コンサルティングを行っている会社です。 "
https://www.sprocket.bz/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away