$30 off During Our Annual Pro Sale. View Details »

実践 iOS オープンソースプロジェクトの始め方

Yoshimasa Niwa
September 17, 2021

実践 iOS オープンソースプロジェクトの始め方

iOS で使えるライブラリを作ったからみんなに使って欲しい、仕事の成果をオープンソースで公開したいということはよくあると思います。
Swift Package Manager の登場や Xcode への GitHub の統合などでオープンソースのライブラリの利用はとても簡単になりました。
しかし、そういったオープンソースのライブラリを提供するのはまだ簡単ではありません。

実際に使いやすいライブラリを提供するには、ライブラリそのものの API のデザインだけでなく、
ライブラリを運用するためのバージョンの管理、CI の設定、ドキュメントの作成や、内部のレポジトリと外部のオープンソースのレポジトリの差異、
Issue の管理のなど多岐にわたる問題への対応が必要になります。

このセッションでは、実際に業務の成果をオープンソースとして公開した「Twitter Text Editor」の経験を踏まえて、API のデザインから運用のためのツールの作成などをまとめていきたいと思います。

対象とする方:
- オープンソースのライブラリを使った iOS アプリの開発の経験がある方
- ライブラリの開発に興味がある方

前提とする知識:
- Git
- GitHub
- Swift Package Manager
- Xcode

詳細:
https://fortee.jp/iosdc-japan-2021/proposal/5a93e99d-159a-4fde-aab8-5ca14ed4ae76

Yoshimasa Niwa

September 17, 2021
Tweet

More Decks by Yoshimasa Niwa

Other Decks in Programming

Transcript

  1. @niw
    09/18/2021 — Online
    iOSDC Japan 2021
    ࣮ફ iOS ΦʔϓϯιʔεϓϩδΣΫτͷ࢝Ίํ

    View Slide

  2. Yoshimasa Niwa
    @niw

    View Slide

  3. View Slide

  4. ϥΠϒϥϦͷ։ൃ

    View Slide

  5. ϥΠϒϥϦͷ։ൃ
    API σβΠϯ

    View Slide

  6. API σβΠϯ
    جຊతͳϙΠϯτ
    Θ͔Γ΍໊͍͢લΛ͚ͭΔ
    ίϯϙʔωϯτؒͷ஌ࣝͷ෼཭
    Α͘஌ΒΕ͍ͯΔύλʔϯʹै͏

    View Slide

  7. APIσβΠϯ
    ԼҐޓ׵ੑͷ୲อ
    ޓ׵ੑͷഁյʹ͸ϝδϟʔόʔδϣϯΞοϓ͕ඞཁ
    ར༻ऀ΁ͷෛ୲
    Swift ͷ௨ৗͷϓϩτίϧ͸มߋ͕Ͱ͖ͳ͍
    @objc @optional ͷ׆༻΋ݕ౼

    View Slide

  8. API σβΠϯ
    ڞ௨ͷػೳ΍ઃఆ
    ϩάͷૹΓઌɺσόοάΦϓγϣϯͳͲ
    ґଘੑ஫ೖͰΞϓϦέʔγϣϯ͕ػೳΛఏڙͰ͖ΔΑ͏ʹ͢
    Δ
    Singleton ͷΦϒδΣΫτΛ໊લۭؒʹ༻ҙ

    View Slide

  9. View Slide

  10. ϥΠϒϥϦͷ։ൃ
    ϥΠηϯε

    View Slide

  11. ϥΠηϯε
    ๏తͳ໰୊͕Θ͔Δਓʹ૬ஊ
    Ұൠతʹ͸ Apache License 2.0 ΍ MIT License ͕ଟ͍ͱࢥ͍
    ·͢
    ͲͷϥΠηϯεΛ࢖͏͔

    View Slide

  12. ϥΠηϯε
    Ͳ͏΍ͬͯදࣔ͢Δ͔
    LICENSE ϑΝΠϧ
    ֤ιʔείʔυʹϥΠηϯεͷ৚จΛϔομͱͯ͠ೖΕΔ

    View Slide

  13. ϥΠηϯε
    SPDX(Software Package Data Exchange) ͸ϥΠηϯε৘ใͳ
    ͲΛهड़͢ΔϑΥʔϚοτ
    1. spdx.org/licenses Ͱ࢖༻͢ΔϥΠηϯεͷ Identifier Λ୳͢
    2. Identifier Λ SPDX short-form identifiers ͷܗࣜͰ֘౰͢Δ
    ιʔείʔυʹίϝϯτͰ௥Ճ
    SPDX Λ࢖͏

    View Slide

  14. View Slide

  15. ϥΠηϯε
    IDETemplateMacros.plist
    υΩϡϝϯτ͕ Xcode ͷϔϧϓʹ͔͠ͳ͍΄΅ൿີͷػೳ
    …xcodeproj/xcshareddata ʹ഑ஔͯ͠ɺϓϩδΣΫτ
    ͝ͱʹࢦఆͰ͖Δ
    Xcode ͕σϑΥϧτͰ࡞ΔϑΝΠϧͷϔομΛมߋͰ͖Δ

    View Slide

  16. View Slide

  17. Copyright ͷ೥͸ຖ೥

    ม͑Δඞཁ͋Δͷʁ

    View Slide

  18. ͍͍͑

    View Slide

  19. ϓϩδΣΫτͷެ։
    ύοέʔδϯά

    View Slide

  20. ύοέʔδϯά
    Swift Package Manager ͷ࠾༻
    Apple ͷϓϥοτϑΥʔϜͰ͸ݱঢ়ɺࣄ্࣮ͷσϑΝΫτɾ
    ελϯμʔυ
    Xcode ͷαϙʔτ͕͋Δ
    ଞͷύοέʔδϚωʔδϟʔͱ΋͋Δఔ౓͸ڞଘͰ͖Δ

    View Slide

  21. ύοέʔδϯά
    CocoaPods ΍ Carthage ΁ͷରԠ
    ଞͷϥΠϒϥϦ΁ͷґଘ͕ͳ͍৔߹͸ɺPodspec ϑΝΠϧ
    ͳͲΛར༻ऀ͕هड़͢Δ͜ͱͰར༻Ͱ͖Δ
    ଞͷϥΠϒϥϦ΁ͷґଘ͕͋Δ৔߹͸ɺPodspec ϑΝΠϧͳ
    Ͳ΋ఏڙ͢Δ͜ͱ͕ߟ͑ΒΕΔ͕ɺόʔδϣϯͷҰ؏ੑͳͲ
    ؾΛ͚ͭΔ͜ͱ͕૿͑Δ

    View Slide

  22. Example ΞϓϦͷಉࠝ
    ͙͢ʹࢼͤΔΑ͏ʹ͢Δ
    ϥΠϒϥϦΛධՁͯ͠΋Β͏ͨΊʹ͸͙͢ʹࢼͤΔΑ͏ʹ͠
    ͓ͯ͘ͱྑ͍
    Example ΞϓϦͷϓϩδΣΫτ͸ͦͷ··ϥΠϒϥϦͷ։ൃ
    ؀ڥͱͯ͠΋࢖͑Δ

    View Slide

  23. Examples
    Sources
    Tests
    Example.xcodeproj
    Package
    Local Package

    View Slide

  24. ϥΠϒϥϦͷ։ൃ
    ·ͱΊ
    API σβΠϯʹ͸ԼҐޓ׵ੑͷߟྀͳͲීஈΑΓߟྀ͢Δ͜
    ͱ͕ଟ͍
    ϥΠηϯεͷදࣔΛͪΌΜͱ͢Δ
    Swift Package Manager Λ࢖͏

    View Slide

  25. ϝϯςφϯεͷܭը

    View Slide

  26. ϝϯςφϯεͷܭը
    Pull Request ͷऔΓѻ͍

    View Slide

  27. Pull Request?

    View Slide

  28. Pull Request ͷऔΓѻ͍
    Pull Request Λड͚෇͚Δ
    ͦ΋ͦ΋ Pull Request Λड͚෇͚Δ͔Ͳ͏͔ΛܾΊ͓ͯ͘
    Pull Request Λड͚෇͚Δ৔߹ɺCLA (Contributor License
    Agreements) ΁ͷಉҙͷ֬ೝͳͲ͕ඞཁ
    CONTRIBUTING ϑΝΠϧͷ௥Ճ

    View Slide

  29. Pull Request ͷऔΓѻ͍
    ϓϥΠϚϦͷϨϙδτϦ
    ΦʔϓϯιʔεͷϨϙδτϦΛͦͷ··ϓϥΠϚϦͱͯ͠ϥ
    ΠϒϥϦͷ։ൃʹ࢖͏৔߹͸໰୊͕ͳ͍
    ։ൃʹ࢖͏ϨϙδτϦ͕ΦʔϓϯιʔεͷϨϙδτϦͰ͋Δ
    ͱ͸ݶΒͳ͍

    View Slide

  30. Pull Request ͷऔΓѻ͍
    Mono Repo ͷ৔߹
    ಛʹ Mono Repo (Monolitic Repository) Ͱ։ൃ͍ͯ͠Δ৔߹͸
    ΦʔϓϯιʔεϨϙδτϦΛϓϥΠϚϦʹ͢Δͷ͕೉͍͠
    Pull Request ͱɺ಺෦ͷ Mono Repo ͷมߋͷಉظ͕ඞཁʹͳ
    Δ

    View Slide

  31. Mono Repo
    Frameworks
    Open Source Library
    Sources
    Tests
    Applications
    Open Source Repo
    Sources
    Tests

    View Slide

  32. Mono Repo Open Source Repo
    Pull Request
    Contribution

    View Slide

  33. Pull Request ͷऔΓѻ͍
    Pull Request ͷऔΓࠐΈ
    GitHub API Λ࢖ͬͯ Pull Request ͔Βίϛοτϝοηʔδͱ
    ύονΛ࡞Δ
    git apply --directory ͰύονΛద༻ͯ͠ίϛοτ
    ͢Δ

    View Slide

  34. Pull Request ͷऔΓѻ͍
    Commit Author
    ֤ Commit ͷ Author Λҡ࣋͢Δ
    Pull Request ʹ͸ Author ͕ෳ਺ਓ͍Δ৔߹͕͋Δ
    ίϛοτϝοηʔδͰ
    Co-authored-by: name
    Λ࢖͏

    View Slide

  35. Mono Repo Open Source Repo
    Pull Request
    GitHub API Contribution
    Testing
    Application

    View Slide

  36. Pull Request ͷऔΓѻ͍
    git format-patch, git am
    git format-patch Ͱ Mono Repo ͷಛఆͷσΟϨΫτϦ
    ಺ͷมߋͷύονΛ࡞੒
    git am ͰύονΛΦʔϓϯιʔεͷϨϙδτϦʹద༻

    View Slide

  37. ϝϯςφϯεͷܭը
    ίϛοτνΣοΫ

    View Slide

  38. ίϛοτνΣοΫ
    λεΫͷछྨ
    Linting ΍ϑΥʔϚοτ
    Ϣχοτςετ
    υΩϡϝϯτੜ੒

    View Slide

  39. ίϛοτνΣοΫ
    CI؀ڥͷޓ׵ੑ
    ։ൃʹ͔ͭ͏ϨϙδτϦͱΦʔϓϯιʔεͷϨϙδτϦͰCI
    ͷ࣮ߦ؀ڥ͕ҟͳΔ৔߹΋͋Δ
    ίϛοτνΣοΫͷͦΕͧΕͷλεΫ͸ݸผʹ࣮ߦͰ͖ΔΑ
    ͏ʹ͓ͯ͘͠

    View Slide

  40. ίϛοτνΣοΫ
    GNU make ͷ׆༻
    ίϛοτνΣοΫͷλεΫ͸ make ͷλʔήοτͱͯ͠هड़
    ͓͖ͯ͠ɺ೚ҙͷ؀ڥͱλΠϛϯάͰ࣮ߦͰ͖ΔΑ͏ʹͯ͠
    ͓͘
    Python ΍ Ruby ʹґଘ͢ΔπʔϧΛ࢖͏৔߹͸ɺεΫϦϓτ
    ͷ࣮ߦ؀ڥΛִ཭͢ΔΑ͏ͳ࢓૊ΈΛಋೖ͢Δ
    VirtualEnv, Bundler ͳͲ

    View Slide

  41. View Slide

  42. GNU make 3.81?

    Ruby 2.6?

    View Slide

  43. ϝϯςφϯεͷܭը
    ·ͱΊ
    Pull Request Λड͚෇͚Δ৔߹ɺͦͷͨΊͷखॱ΍λεΫͳ
    ͲΛ੔͓͑ͯ͘
    ίϛοτνΣοΫͷλεΫΛ೚ҙͷ؀ڥͱλΠϛϯάͰ࣮ߦ
    Ͱ͖ΔΑ͏ʹ͓ͯ͘͠

    View Slide

  44. ϓϩδΣΫτͷެ։

    View Slide

  45. ϓϩδΣΫτͷެ։
    GitHub
    ࣄ্࣮ Swift Package Manager ͷσϑΥϧτͷϨδετϦ
    ಛผͳཧ༝ͳͲ͕ͳ͚Ε͹ GitHub Λར༻͢Ε͹ྑ͍

    View Slide

  46. ϓϩδΣΫτͷެ։
    GitHub Actions
    macOS ͕࢖͑ΔͷͰɺίϛοτνΣοΫͷ Xcode Λ࢖ͬͨ
    λεΫ͕࣮ߦՄೳ
    Pull Request ΍ίϛοτͷ Push ͷࡍʹίϛοτνΣοΫΛ
    ࣮ߦ͢Δ
    GitHub Pages Λ࢖ͬͯੜ੒ͨ͠υΩϡϝϯτΛϗεςΟϯά

    View Slide

  47. View Slide

  48. ϓϩδΣΫτͷެ։
    ISSUE_TEMPLATE
    ࣗ༝ʹهड़Ͱ͖Δ Issue ͸ҙਤ͕໌֬Ͱ͸ͳ͍৔߹͕͋Δ
    όάใࠂͷϑΥʔϚοτΛఆܕจͱͯ͠༻ҙ͓ͯ͘͠

    View Slide

  49. View Slide

  50. ϓϩδΣΫτͷެ։
    PULL_REQUEST_TEMPLATE
    ಉ༷ʹ Pull Request ΋ࣗ༝ʹهड़Ͱ͖Δͱҙਤ͕໌֬Ͱ͸ͳ
    ͍৔߹͕͋Δ
    Pull Request ͸ͦͷ··ίϛοτϝοηʔδͱͯ͠ར༻Ͱ͖
    ΔΑ͏ʹɺఆܕจΛ༻ҙ͓ͯ͘͠

    View Slide

  51. View Slide

  52. ϓϩδΣΫτͷެ։
    ·ͱΊ
    Swift Package Manager ͷࣄ্࣮ͷσϑΥϧτͷϨδετϦ
    ͕ GitHub ͳͷͰɺGitHub Ͱެ։͢Δͷ͕ྑ͍
    GitHub ActionsɺIssue ΍ Pull Request ͷఆܕจͷ࡞੒ͯ͠
    ͓͘

    View Slide

  53. ޿͘஌ͬͯ΋Β͏

    View Slide

  54. Φʔϓϯιʔεͷҙٛ
    ίϛϡχςΟ΁ͷؐݩ

    View Slide