Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

実践 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

E4e01fb8b7105e61e3876224139503ab?s=128

Yoshimasa Niwa

September 17, 2021
Tweet

Transcript

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

  2. Yoshimasa Niwa @niw

  3. None
  4. ϥΠϒϥϦͷ։ൃ

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

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

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

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

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

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

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

  13. ϥΠηϯε SPDX(Software Package Data Exchange) ͸ϥΠηϯε৘ใͳ ͲΛهड़͢ΔϑΥʔϚοτ 1. spdx.org/licenses Ͱ࢖༻͢ΔϥΠηϯεͷ

    Identifier Λ୳͢ 2. Identifier Λ SPDX short-form identifiers ͷܗࣜͰ֘౰͢Δ ιʔείʔυʹίϝϯτͰ௥Ճ SPDX Λ࢖͏
  14. None
  15. ϥΠηϯε IDETemplateMacros.plist υΩϡϝϯτ͕ Xcode ͷϔϧϓʹ͔͠ͳ͍΄΅ൿີͷػೳ …xcodeproj/xcshareddata ʹ഑ஔͯ͠ɺϓϩδΣΫτ ͝ͱʹࢦఆͰ͖Δ Xcode ͕σϑΥϧτͰ࡞ΔϑΝΠϧͷϔομΛมߋͰ͖Δ

  16. None
  17. Copyright ͷ೥͸ຖ೥
 ม͑Δඞཁ͋Δͷʁ

  18. ͍͍͑

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

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

    ଞͷύοέʔδϚωʔδϟʔͱ΋͋Δఔ౓͸ڞଘͰ͖Δ
  21. ύοέʔδϯά CocoaPods ΍ Carthage ΁ͷରԠ ଞͷϥΠϒϥϦ΁ͷґଘ͕ͳ͍৔߹͸ɺPodspec ϑΝΠϧ ͳͲΛར༻ऀ͕هड़͢Δ͜ͱͰར༻Ͱ͖Δ ଞͷϥΠϒϥϦ΁ͷґଘ͕͋Δ৔߹͸ɺPodspec ϑΝΠϧͳ

    Ͳ΋ఏڙ͢Δ͜ͱ͕ߟ͑ΒΕΔ͕ɺόʔδϣϯͷҰ؏ੑͳͲ ؾΛ͚ͭΔ͜ͱ͕૿͑Δ
  22. Example ΞϓϦͷಉࠝ ͙͢ʹࢼͤΔΑ͏ʹ͢Δ ϥΠϒϥϦΛධՁͯ͠΋Β͏ͨΊʹ͸͙͢ʹࢼͤΔΑ͏ʹ͠ ͓ͯ͘ͱྑ͍ Example ΞϓϦͷϓϩδΣΫτ͸ͦͷ··ϥΠϒϥϦͷ։ൃ ؀ڥͱͯ͠΋࢖͑Δ

  23. Examples Sources Tests Example.xcodeproj Package Local Package

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

  25. ϝϯςφϯεͷܭը

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

  27. Pull Request?

  28. Pull Request ͷऔΓѻ͍ Pull Request Λड͚෇͚Δ ͦ΋ͦ΋ Pull Request Λड͚෇͚Δ͔Ͳ͏͔ΛܾΊ͓ͯ͘

    Pull Request Λड͚෇͚Δ৔߹ɺCLA (Contributor License Agreements) ΁ͷಉҙͷ֬ೝͳͲ͕ඞཁ CONTRIBUTING ϑΝΠϧͷ௥Ճ
  29. Pull Request ͷऔΓѻ͍ ϓϥΠϚϦͷϨϙδτϦ ΦʔϓϯιʔεͷϨϙδτϦΛͦͷ··ϓϥΠϚϦͱͯ͠ϥ ΠϒϥϦͷ։ൃʹ࢖͏৔߹͸໰୊͕ͳ͍ ։ൃʹ࢖͏ϨϙδτϦ͕ΦʔϓϯιʔεͷϨϙδτϦͰ͋Δ ͱ͸ݶΒͳ͍

  30. Pull Request ͷऔΓѻ͍ Mono Repo ͷ৔߹ ಛʹ Mono Repo (Monolitic

    Repository) Ͱ։ൃ͍ͯ͠Δ৔߹͸ ΦʔϓϯιʔεϨϙδτϦΛϓϥΠϚϦʹ͢Δͷ͕೉͍͠ Pull Request ͱɺ಺෦ͷ Mono Repo ͷมߋͷಉظ͕ඞཁʹͳ Δ
  31. Mono Repo Frameworks Open Source Library Sources Tests Applications Open

    Source Repo Sources Tests
  32. Mono Repo Open Source Repo Pull Request Contribution

  33. Pull Request ͷऔΓѻ͍ Pull Request ͷऔΓࠐΈ GitHub API Λ࢖ͬͯ Pull

    Request ͔Βίϛοτϝοηʔδͱ ύονΛ࡞Δ git apply --directory ͰύονΛద༻ͯ͠ίϛοτ ͢Δ
  34. Pull Request ͷऔΓѻ͍ Commit Author ֤ Commit ͷ Author Λҡ࣋͢Δ

    Pull Request ʹ͸ Author ͕ෳ਺ਓ͍Δ৔߹͕͋Δ ίϛοτϝοηʔδͰ Co-authored-by: name <name@example.com> Λ࢖͏
  35. Mono Repo Open Source Repo Pull Request GitHub API Contribution

    Testing Application
  36. Pull Request ͷऔΓѻ͍ git format-patch, git am git format-patch Ͱ

    Mono Repo ͷಛఆͷσΟϨΫτϦ ಺ͷมߋͷύονΛ࡞੒ git am ͰύονΛΦʔϓϯιʔεͷϨϙδτϦʹద༻
  37. ϝϯςφϯεͷܭը ίϛοτνΣοΫ

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

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

  40. ίϛοτνΣοΫ GNU make ͷ׆༻ ίϛοτνΣοΫͷλεΫ͸ make ͷλʔήοτͱͯ͠هड़ ͓͖ͯ͠ɺ೚ҙͷ؀ڥͱλΠϛϯάͰ࣮ߦͰ͖ΔΑ͏ʹͯ͠ ͓͘ Python

    ΍ Ruby ʹґଘ͢ΔπʔϧΛ࢖͏৔߹͸ɺεΫϦϓτ ͷ࣮ߦ؀ڥΛִ཭͢ΔΑ͏ͳ࢓૊ΈΛಋೖ͢Δ VirtualEnv, Bundler ͳͲ
  41. None
  42. GNU make 3.81?
 Ruby 2.6?

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

  44. ϓϩδΣΫτͷެ։

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

  46. ϓϩδΣΫτͷެ։ GitHub Actions macOS ͕࢖͑ΔͷͰɺίϛοτνΣοΫͷ Xcode Λ࢖ͬͨ λεΫ͕࣮ߦՄೳ Pull Request

    ΍ίϛοτͷ Push ͷࡍʹίϛοτνΣοΫΛ ࣮ߦ͢Δ GitHub Pages Λ࢖ͬͯੜ੒ͨ͠υΩϡϝϯτΛϗεςΟϯά
  47. None
  48. ϓϩδΣΫτͷެ։ ISSUE_TEMPLATE ࣗ༝ʹهड़Ͱ͖Δ Issue ͸ҙਤ͕໌֬Ͱ͸ͳ͍৔߹͕͋Δ όάใࠂͷϑΥʔϚοτΛఆܕจͱͯ͠༻ҙ͓ͯ͘͠

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

    ΔΑ͏ʹɺఆܕจΛ༻ҙ͓ͯ͘͠
  51. None
  52. ϓϩδΣΫτͷެ։ ·ͱΊ Swift Package Manager ͷࣄ্࣮ͷσϑΥϧτͷϨδετϦ ͕ GitHub ͳͷͰɺGitHub Ͱެ։͢Δͷ͕ྑ͍

    GitHub ActionsɺIssue ΍ Pull Request ͷఆܕจͷ࡞੒ͯ͠ ͓͘
  53. ޿͘஌ͬͯ΋Β͏

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