読者です 読者をやめる 読者になる 読者になる

OSSの作り方(Repositoryの作成からCocoaPods、Carthageでのインストールまで)

iOS OSS CocoaPods Carthage

try! SwiftDaniel SteinbergさんのセッションJeff HuiさんのセッションHiroki Katoさんのセッション に触発されて、 UITableViewにMVVMを適用するためのライブラリを作ろうと思ったんですが、OSS作ったことがなかったので、OSSの作り方からなぞってみました!
(CocoaPodsとCarthageで使えるようになるまで)
今回のリポジトリこちらで公開しています。

今回やったこと

  • frameworkの作成
  • アプリケーションからのimport
  • Carthage対応
  • CocoaPods対応

frameworkの作成

まずは、frameworkを作ります。
内容は重要ではないので、Helloクラスの中にworldメソッドを用意しただけのHelloWorld.frameworkを作りました。 f:id:nerd0geek1:20160320231157p:plain

アプリケーションからのimport

先程作成したframeworkをビルドし、HelloWorld.frameworkを作成します。 それを新規に作成したiOSアプリのプロジェクトに追加し、以下のように呼び出します。 consoleに"Hello world"と表示され、期待通りの動作をしているのがわかります。 f:id:nerd0geek1:20160320231209p:plain

注意点

公開するクラス、メソッドには全てpublic修飾子を付ける

Swiftではアクセス修飾子を何もつけない状態では、デフォルトのinternalとなり、Module(この場合、frameworkが1つのModuleとなる)外からはアクセスできません。
そのため、クラスとメソッドの両方にpublic修飾子を付けていないと以下のようなエラーが発生してしまいます。

クラスにpublicがついていないと、framework外からHelloクラスを参照できない。 f:id:nerd0geek1:20160320231227p:plain クラスにのみpublicが付いた状態だと、Helloクラスは参照できるが、worldメソッドを参照できない f:id:nerd0geek1:20160320231237p:plain

frameworkを実機でビルドし、アプリケーションも実機で実行する

frameworkをビルドしただけの状態では、 Build Active Architecture Only の値にもよりますが、 実機用のアーキテクチャでのみビルドされるようになります。
(下記コマンドの詳細はこちらのポスト) f:id:nerd0geek1:20160320231415p:plain そのため、iOSアプリをSimulator上で実行しようとすると下記のようなエラーが発生します。 f:id:nerd0geek1:20160320231245p:plain この問題はCarthageやCocoaPodsを利用することで容易に解決できます。

Carthage対応

以上のように作成したframeworkをCarthageに対応させるためには、 frameworkのtargetをshared Schemeに変更し、以下のコマンドを実行するだけです。 f:id:nerd0geek1:20160321005426p:plain

carthage build --no-skip-current

iOS SimulatorのArchitectureについてはCarthage側で対応してくれるようで、 生成されたframeworkについては、i386x86_64をサポートした状態になっていました。 f:id:nerd0geek1:20160320231609p:plain

CocoaPods

CocoaPodsについては、 pod spec create LIBRARY_NAMEというコマンドを実行することで LIBRARY_NAME.podspecという名前のファイルが生成されるので、 f:id:nerd0geek1:20160321011507p:plain pod lib lint を実行&修正を繰り返すことで、公開できる状態に修正していくことができます。

注意点

Swiftで書かれたライブラリはiOS8以降でしか使えないため、その旨をpodspecに記載する必要があります。
また、初期状態では source_files に.swiftが含まれていませんので追記する必要があります。 f:id:nerd0geek1:20160321012015p:plain

まとめ

今回の内容をまとめることによって、OSSをどう作るかということについてだけでなく、 アクセス修飾子や、コンパイル時のアーキテクチャなどについても理解が進んだので学びの良い機会になったと思います。 次回は実際にライブラリを作成し、公開するまでをやってみたいと思います。

参考