OSSの作り方(Repositoryの作成からCocoaPods、Carthageでのインストールまで)
try! SwiftのDaniel Steinbergさんのセッション、
Jeff Huiさんのセッション、Hiroki Katoさんのセッション
に触発されて、
UITableViewにMVVMを適用するためのライブラリを作ろうと思ったんですが、OSS作ったことがなかったので、OSSの作り方からなぞってみました!
(CocoaPodsとCarthageで使えるようになるまで)
今回のリポジトリはこちらで公開しています。
今回やったこと
- frameworkの作成
- アプリケーションからのimport
- Carthage対応
- CocoaPods対応
frameworkの作成
まずは、frameworkを作ります。
内容は重要ではないので、Helloクラスの中にworldメソッドを用意しただけのHelloWorld.frameworkを作りました。
アプリケーションからのimport
先程作成したframeworkをビルドし、HelloWorld.frameworkを作成します。
それを新規に作成したiOSアプリのプロジェクトに追加し、以下のように呼び出します。
consoleに"Hello world"と表示され、期待通りの動作をしているのがわかります。
注意点
公開するクラス、メソッドには全てpublic修飾子を付ける
Swiftではアクセス修飾子を何もつけない状態では、デフォルトのinternalとなり、Module(この場合、frameworkが1つのModuleとなる)外からはアクセスできません。
そのため、クラスとメソッドの両方にpublic修飾子を付けていないと以下のようなエラーが発生してしまいます。
クラスにpublicがついていないと、framework外からHelloクラスを参照できない。
クラスにのみpublicが付いた状態だと、Helloクラスは参照できるが、worldメソッドを参照できない
frameworkを実機でビルドし、アプリケーションも実機で実行する
frameworkをビルドしただけの状態では、 Build Active Architecture Only
の値にもよりますが、
実機用のアーキテクチャでのみビルドされるようになります。
(下記コマンドの詳細はこちらのポスト)
そのため、iOSアプリをSimulator上で実行しようとすると下記のようなエラーが発生します。
この問題はCarthageやCocoaPodsを利用することで容易に解決できます。
Carthage対応
以上のように作成したframeworkをCarthageに対応させるためには、
frameworkのtargetをshared Schemeに変更し、以下のコマンドを実行するだけです。
carthage build --no-skip-current
iOS SimulatorのArchitectureについてはCarthage側で対応してくれるようで、
生成されたframeworkについては、i386、x86_64をサポートした状態になっていました。
CocoaPods
CocoaPodsについては、 pod spec create LIBRARY_NAME
というコマンドを実行することで
LIBRARY_NAME.podspecという名前のファイルが生成されるので、
pod lib lint
を実行&修正を繰り返すことで、公開できる状態に修正していくことができます。
注意点
Swiftで書かれたライブラリはiOS8以降でしか使えないため、その旨をpodspecに記載する必要があります。
また、初期状態では source_files
に.swiftが含まれていませんので追記する必要があります。
まとめ
今回の内容をまとめることによって、OSSをどう作るかということについてだけでなく、 アクセス修飾子や、コンパイル時のアーキテクチャなどについても理解が進んだので学びの良い機会になったと思います。 次回は実際にライブラリを作成し、公開するまでをやってみたいと思います。