Jeff Hui
iOS開発に特化したフルスタックエンジニアです。コンサルタントとして多くのiOSアプリ開発プロジェクトに従事しています。活発にオープンソースにコントリビュートしており、テストフレームであるQuick/Nimbleのコアチームメンバーです。
ライブラリには将来があります。しかし、プラットフォーム、パッケージマネージャー、テストなどの影響を受ける可能性があります。Swiftで書かれたライブラリのリリースやメンテナンスに関連するツールやプロセスの解説をします。
Here's my slides for Try! Swift talk. https://t.co/SpMH57caTt. Although the example project is probably more useful: https://t.co/XXfUhePB4S
— Jeff Hui (@jeffhui) 2016, 3月 10
想像してみてください、新しい言語があって素晴らしいフレームワークがある。APIとしてはよくないけどSwiftっぽくするとします。世界の人達と共有して一日、何日という時間を減らせるかもしれない。
どうしたら良いでしょう
ライブラリを作ります
tv, watch, iOS... 簡単にデベロッパがライブラリを統合できるようにしたい。CocoaPod, Carthage?
コントリビューションも受け取りたい。一定のレベルを保証したい。テスト。それでリグレッション、破壊を防ぐ。最終的にはリリースを管理する。
コード周りでたくさんの作業があります!
コード周りでライブラリのインフラになる。それが私のトピックです。
Swiftは素晴らしい言語ですがエコシステムでライブラリが増えればもっと良い。 過去より出来ることが今はたくさんある。
ライブラリを試しに作ってみましょう
カビゴンです!!
唯一の機能はランダムな時間スリープさせる
ドキュメントもテストもある!
非同期テストを使いました。
公開するにはいくつか手を入れておくと便利になります
iOS向けということでやります
Sharedにして他の人に設定を共有します
これでエクステンションと統合できます
モジュールネーム
以上です!
Test(CI)
オープンソースにするなら選択肢は1つ。トラビス。機能が沢山。Jenkinsではやることが沢山。
設定は .travis.yml ファイルのこの3行で出来ます。
テストスクリプトも簡単
プラットフォームごとに何回も同じことを書いているだけです。
リクエストが有れば自動でTravisがテストしてくれ瑠葉になりました!
今後カビゴンはデベロッパがサブプロジェクトとして組み込めば使えますが3つのパッケージマネージャに対応して便利にしましょう
CocoaPods
PodSpecファイルを定義します。ライブラリメンテナとして設定を指定する必要があります。一つのコマンドで出来ます
ライブラリの名前などを微調整します。必要な依存性をリストしてくれます。今回はFundation。他にサードパーティーに依存があれば入れましょう。
Carthage
ユーザーがプロジェクトに統合する必要がある。
ひとつのコマンドで利用可能かチェックが出来る。
依存性がある場合はCartファイルを設定。
SPM
もっと作業が必要になる。唯一Linuxをサポート。
依存性があればどうように設定。
2つのファイルが必要で、特定の構造である必要がある。
テストファイルはテストフォルダに
Linuxは別のファイル
これがLinuxmain
LinuxMainはみなさんのプロジェクトだけに入れる。利用者のプロジェクトに入れるものではないですね。
async がないからコンバートしました。
Linuxだけで使われるように指定が必要。
他のケースと矛盾しないように定義します。
そしてビルド、テストします。
しかしまだ問題は有ります。SwiftLinuxは安定していなくてバージョンが毎週出ます
開発者が使うものとCIライブラリで使っているものが一緒である必要があり、コンスタントにアップデートが必要。
環境ツールが有ります。
指定のスナップショットをインストールして実行出来る
CIは少し違います
どのプラットフォームが入っているか一目でわかる
リリースはバージョニングを考えていく必要がある。
よくあるのはセマンティックバージョン
オペレーションが変わる.新機能.バグフィックス
最初は1で出す、リリース毎にバージョンを上げていく。バージョニングは素晴らしい説明がありますのでご参照下さい
実際のリリースをどうするか
PodSpecをCocoaPodに送る必要があります。そうするとCocoaPodsで新しいバージョンが使えるようになる。
公開しています
コミットヒストリーもステップごとに書いてあります。サポートする全プラットフォームについて書いてあります。
supplementaryというのは参考資料です。
ありがとうございました。
QA
GitのTagにバージョンに v をつけていたがつけたほうがいいのか。
TabやSpaceとともに人生における難しい問題ですね。私はつけています。 フィルタリングがしやすい。他のタグ、ブランチ、古いSwiftのバージョンだったり、デプロイだったりで使っている場合、タグのカテゴリ化がわかりやすくなる。
特にライブラリが他のライブラリに依存する時推奨することは有りますか?
カビゴンリポジトリでは他の依存性をライブラリの一部として引き入れています。ただSwiftパッケージマネージャは他のライブラリがサポートされていないので難しい。CocoaPodsやCarthageは簡単。CocoaPodsは他の人が使っていないと使えないので依存性解決にはオススメしません。Carthageは手動でやるのはCocoaPodsの方では変更してしまうものがあるのでオススメできないですが。
ここで例えば、内部ライブラリだったリソースが公開したくないものがあった場合推奨するやり方は有りますか?
現状の社内エコシステムによります。CocoaPodsだけを使っているならPodSpecを作ればいいと思います。Gitを使っているならGithubのsubmodule使ったりも有りだと思います。すべてのライブラリがすべてのパッケージに対応する必要はないと思います。適切な部分を抜粋して使えばいいと思います。
https://t.co/8Tj5UdeCrs 困った時にこのリポジトリ見ればライブラリ作成のベストプラクティスはバッチリという感じだ #tryswiftconf
— ぎぎにゃん (@giginet) March 3, 2016
LinuxMain.swiftはまだよく分かっていなかったんだよ。これ相当をcorelibs-xctest側で自動生成するようにするPRは出ている #tryswiftconf https://t.co/0aG37TWM8q
— Syo Ikeda / いけしょー (@ikesyo) March 3, 2016
なるほど。リフレクションが使えないからLunuxではテストクラスを明示的に与える必要がかるのかを #tryswiftconf
— kishikawa katsumi (@k_katsumi) March 3, 2016
Swift にも swiftenv のようなツールがいる時代か #tryswiftconf
— 宇佐見 公輔 (@usamik26) March 3, 2016
「Swiftライブラリの作り方 多くの人に使ってもらうには…! #tryswiftconf」をトゥギャりました。 https://t.co/P7qzrDOmh8
— トゥギャッター開発まとめ (@tg__dev) March 3, 2016
気に入った記事は はてなブックマーク
はてなブックマークアプリiOS開発チームから来ました! はてなブックマークにはSwift特集があります! 良い記事を見逃さないように、ご利用ください! http://b.hatena.ne.jp/hotentry/it/Swift
そして良いまとめ記事があったらはてなブックマークでブックマークしましょう! try! Swift の記事で盛り上がると嬉しいです!