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

try! Swift ライブラリの開発 #tryswiftconf Day2-8

try! Swift 2016

Jeff Hui

iOS開発に特化したフルスタックエンジニアです。コンサルタントとして多くのiOSアプリ開発プロジェクトに従事しています。活発にオープンソースにコントリビュートしており、テストフレームであるQuick/Nimbleのコアチームメンバーです。

twitter.com

ライブラリには将来があります。しかし、プラットフォーム、パッケージマネージャー、テストなどの影響を受ける可能性があります。Swiftで書かれたライブラリのリリースやメンテナンスに関連するツールやプロセスの解説をします。

speakerdeck.com

想像してみてください、新しい言語があって素晴らしいフレームワークがある。APIとしてはよくないけどSwiftっぽくするとします。世界の人達と共有して一日、何日という時間を減らせるかもしれない。

どうしたら良いでしょう

ライブラリを作ります

tv, watch, iOS... 簡単にデベロッパがライブラリを統合できるようにしたい。CocoaPod, Carthage?

コントリビューションも受け取りたい。一定のレベルを保証したい。テスト。それでリグレッション、破壊を防ぐ。最終的にはリリースを管理する。

f:id:niwatako:20160303153124j:plain

コード周りでたくさんの作業があります! f:id:niwatako:20160303153132j:plain

コード周りでライブラリのインフラになる。それが私のトピックです。 f:id:niwatako:20160303153159j:plain

Swiftは素晴らしい言語ですがエコシステムでライブラリが増えればもっと良い。 過去より出来ることが今はたくさんある。

ライブラリを試しに作ってみましょう f:id:niwatako:20160303153239j:plain

カビゴンです!! f:id:niwatako:20160303153250j:plain 唯一の機能はランダムな時間スリープさせる f:id:niwatako:20160303153307j:plain ドキュメントもテストもある! f:id:niwatako:20160303153315j:plain

非同期テストを使いました。

公開するにはいくつか手を入れておくと便利になります f:id:niwatako:20160303153358j:plain

iOS向けということでやります f:id:niwatako:20160303153423j:plain Sharedにして他の人に設定を共有します

これでエクステンションと統合できます f:id:niwatako:20160303153442j:plain

f:id:niwatako:20160303153505j:plain モジュールネーム f:id:niwatako:20160303153509j:plain

以上です!

Test(CI)

f:id:niwatako:20160303153615j:plain オープンソースにするなら選択肢は1つ。トラビス。機能が沢山。Jenkinsではやることが沢山。 f:id:niwatako:20160303153645j:plain

設定は .travis.yml ファイルのこの3行で出来ます。 f:id:niwatako:20160303153700j:plain

テストスクリプトも簡単 f:id:niwatako:20160303153731j:plain

プラットフォームごとに何回も同じことを書いているだけです。

f:id:niwatako:20160303153754j:plain

リクエストが有れば自動でTravisがテストしてくれ瑠葉になりました!

今後カビゴンデベロッパがサブプロジェクトとして組み込めば使えますが3つのパッケージマネージャに対応して便利にしましょう

CocoaPods

f:id:niwatako:20160303153849j:plain

PodSpecファイルを定義します。ライブラリメンテナとして設定を指定する必要があります。一つのコマンドで出来ます f:id:niwatako:20160303153916j:plain

ライブラリの名前などを微調整します。必要な依存性をリストしてくれます。今回はFundation。他にサードパーティーに依存があれば入れましょう。

Carthage

f:id:niwatako:20160303154001j:plain ユーザーがプロジェクトに統合する必要がある。 ひとつのコマンドで利用可能かチェックが出来る。 f:id:niwatako:20160303154025j:plain

依存性がある場合はCartファイルを設定。

SPM

f:id:niwatako:20160303154108j:plain もっと作業が必要になる。唯一Linuxをサポート。

f:id:niwatako:20160303154137j:plain

依存性があればどうように設定。

2つのファイルが必要で、特定の構造である必要がある。 f:id:niwatako:20160303154214j:plain

ストファイルはテストフォルダに f:id:niwatako:20160303154241j:plain

Linuxは別のファイル f:id:niwatako:20160303154251j:plain これがLinuxmain f:id:niwatako:20160303154307j:plain

LinuxMainはみなさんのプロジェクトだけに入れる。利用者のプロジェクトに入れるものではないですね。

async がないからコンバートしました。 f:id:niwatako:20160303154349j:plain f:id:niwatako:20160303154354j:plain

Linuxだけで使われるように指定が必要。 f:id:niwatako:20160303154405j:plain 他のケースと矛盾しないように定義します。

そしてビルド、テストします。 f:id:niwatako:20160303154437j:plain

しかしまだ問題は有ります。SwiftLinuxは安定していなくてバージョンが毎週出ます f:id:niwatako:20160303154504j:plain

開発者が使うものとCIライブラリで使っているものが一緒である必要があり、コンスタントにアップデートが必要。

環境ツールが有ります。 f:id:niwatako:20160303154530j:plain

指定のスナップショットをインストールして実行出来る f:id:niwatako:20160303154543j:plain

CIは少し違います f:id:niwatako:20160303154611j:plain どのプラットフォームが入っているか一目でわかる f:id:niwatako:20160303154643j:plain

Linuxが落ちたのかOS Xか?分かる。

リリースはバージョニングを考えていく必要がある。 f:id:niwatako:20160303154713j:plain よくあるのはセマンティックバージョン f:id:niwatako:20160303154721j:plain

オペレーションが変わる.新機能.バグフィックス f:id:niwatako:20160303154758j:plain

最初は1で出す、リリース毎にバージョンを上げていく。バージョニングは素晴らしい説明がありますのでご参照下さい f:id:niwatako:20160303154845j:plain

実際のリリースをどうするか f:id:niwatako:20160303154858j:plain

PodSpecをCocoaPodに送る必要があります。そうするとCocoaPodsで新しいバージョンが使えるようになる。

公開しています f:id:niwatako:20160303155006j:plain

コミットヒストリーもステップごとに書いてあります。サポートする全プラットフォームについて書いてあります。

supplementaryというのは参考資料です。

f:id:niwatako:20160303155102j:plain ありがとうございました。

QA

GitのTagにバージョンに v をつけていたがつけたほうがいいのか。

TabやSpaceとともに人生における難しい問題ですね。私はつけています。 フィルタリングがしやすい。他のタグ、ブランチ、古いSwiftのバージョンだったり、デプロイだったりで使っている場合、タグのカテゴリ化がわかりやすくなる。

特にライブラリが他のライブラリに依存する時推奨することは有りますか?

カビゴンリポジトリでは他の依存性をライブラリの一部として引き入れています。ただSwiftパッケージマネージャは他のライブラリがサポートされていないので難しい。CocoaPodsやCarthageは簡単。CocoaPodsは他の人が使っていないと使えないので依存性解決にはオススメしません。Carthageは手動でやるのはCocoaPodsの方では変更してしまうものがあるのでオススメできないですが。

ここで例えば、内部ライブラリだったリソースが公開したくないものがあった場合推奨するやり方は有りますか?

現状の社内エコシステムによります。CocoaPodsだけを使っているならPodSpecを作ればいいと思います。Gitを使っているならGithubのsubmodule使ったりも有りだと思います。すべてのライブラリがすべてのパッケージに対応する必要はないと思います。適切な部分を抜粋して使えばいいと思います。

気に入った記事は はてなブックマーク

はてなブックマークアプリiOS開発チームから来ました! はてなブックマークにはSwift特集があります! 良い記事を見逃さないように、ご利用ください! http://b.hatena.ne.jp/hotentry/it/Swift

そして良いまとめ記事があったらはてなブックマークでブックマークしましょう! try! Swift の記事で盛り上がると嬉しいです!