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

Multi-Module 101

8ab71237da39f6b1ec47da53f33c3ec8?s=47 Jierong Li
December 17, 2021

Multi-Module 101

どういう形のターゲットでマルチモジュール化について。

8ab71237da39f6b1ec47da53f33c3ec8?s=128

Jierong Li

December 17, 2021
Tweet

More Decks by Jierong Li

Other Decks in Programming

Transcript

  1. MULTI-MODULE 101 YUMEMI.SWIFT #14 〜今年の振り返り〜

  2. ⾃⼰紹介 JIERONG LI (李) ▸ 株式会社ゆめみ ▸ iOSエンジニア ▸ 永遠にリリースできず個⼈開発

    ▸ https://jierong.dev
  3. MULTI-MODULE?

  4. MULTI-MODULE 101 MULTI-MODULE?

  5. MULTI-TARGET?

  6. None
  7. None
  8. None
  9. None
  10. マルチモジュール

  11. メリット

  12. マルチモジュール メリット ▸ アプリから独⽴できる ▸ ビルドが早い ▸ プレビューが早い ▸ テストが早い

    ▸ アプリ起動なしでテスト実⾏できる ▸ ある程度疎結合な設計が強いられる
  13. マルチモジュール ハードル ▸ どういう形のターゲットでマルチモジュール化 ▸ マルチジュールしやすい設計 ▸ 疎結合 ▸ 循環依存がない

    ▸ など
  14. マルチモジュール ハードル ▸ どういう形のターゲットでマルチモジュール化 ▸ マルチジュールしやすい設計 ▸ 疎結合 ▸ 循環依存がない

    ▸ など
  15. どういう形のターゲット でマルチモジュール化

  16. None
  17. LIBRARY OR 
 FRAMEWORK

  18. LIBRARY OR FRAMEWORK リソースが持てるかどうか Target Membershipにチェック⼊れることすらできない

  19. DYNAMIC OR 
 STATIC

  20. DYNAMIC OR STATIC (DYNAMIC) FRAMEWORK ▸ .frameworkとしてembedされる ▸ 起動時に動的にロードされる(dyld) ▸

    Info.plistなどのリソースが含まれる
  21. DYNAMIC OR STATIC STATIC LIBRARY ▸ .framework的なもの⾒当たらない ▸ Static Library

    Link前後の実⾏ファイル(MultiModul) のサイズ ▸ 前:95,664 bytes ▸ 後:95,920 bytes ▸ 実⾏ファイルとしてビルドされる ▸ 動的ロードする時間がかからない ▸ 複数な実⾏ファイルがある場合サイズが数倍になる
  22. DYNAMIC OR STATIC DYNAMIC LIBRARY AND STATIC FRAMEWORK? ▸ Dynamic

    Library ▸ 仕組み上可能だけど、Dynamic Frameworkと同じように動的ロードする時間が必要な ら、リソース持てるFrameworkの⽅を使うのが便利 ▸ Static Framework ▸ Frameworkをembedしないとリソースが持てない ▸ ソースコードがアプリ実⾏ファイルとしてビルドされる ▸ Bundle(for: SomeClass.self)のようにFrameworkのBundleをアクセスできなくなる
  23. どういう形のターゲットでマルチモジュール化 DYNAMIC FRAMEWORK OR STATIC LIBRARY ▸ OS X時期 ▸

    実⾏ファイルサイズ削減視点で、Dynamicが推奨されたけど ▸ WWDC 2016:Overview of Dynamic Libraries ▸ 実⾏効率視点で、Staticが推奨された ▸ 総合的に ▸ Staticが優先 ▸ 実⾏ファイルサイズを考慮するなど⽌むを得ない場合Dynamic
  24. 動的ロードする時間を省け たいけど、リソースも持た せたい どういう形のターゲットでマルチモジュール化

  25. None
  26. 動的ロードする時間を省けたいけど、リソースも持たせたい 対策 ▸ Static Libraryでターゲットを作成 ▸ 別途Bundle(macOS)ターゲットでリソースを持たせる ▸ BundleName.bundleというファイルがアプリに含まれ ▸

    Bundle.main.resourceURL?.appendingPathComponent(bundleName + ".bundle")で直接参照
  27. 動的ロードする時間を省けたいけど、リソースも持たせたい 問題 ▸ ⼿間がかかる ▸ Tuistがやってくれる ▸ Static LibraryではXcode Previewsが使えない

    ▸ 別途Xcode Previews⽤に同じDynamic Framework作成 ▸ さらに⼿間がかかる ▸ XcodeGenとTuistのようなXcode Project⽣成するツールであれば割と簡単 ▸ はたして正規⼿段か?
  28. もう⼀つターゲットの形 SWIFT PACKAGE ▸ Xcode Previews使える ▸ swift-tools-version:5.3以降であればリソースが持たせる

  29. SWIFT PACKAGE DYNAMIC OR STATIC ▸ library(name:type:targets:)のtypeによって決められる ▸ nilの場合DynamicとStatic両⽅可能、Xcodeが決めてくれる ▸

    Xcodeの決め⽅ ▸ Static優先 ▸ duplicate symbols回避するためにDynamic ▸ 例:アプリとアプリにリンクされたDynamic Frameworkに使われた場合
  30. SWIFT PACKAGE DYNAMICリンクされた場合

  31. SWIFT PACKAGE STATICリンクされた場合

  32. それぞれDYNAMIC FRAMEWORK とSTATIC LIBRARYと⼀緒で、STATIC リンクされ た場合リソースどう持たせるの? SWIFT PACKAGE

  33. SWIFT PACKAGE リソースの持ち⽅ ▸ Bundleに持たせる ▸ あらゆるケースを想定し Bundle.moduleを提供

  34. ⾯倒ことせずにリソースを持てる し、XCODE PREVIEWSも使えるので、 SWIFT PACKAGEでいいんじゃない? SWIFT PACKAGE

  35. SWIFT PACKAGE BUILD PHASESがない ▸ ビルド前後⾊々できない(しにくい) ▸ コード⽣成 ▸ Lint

    ▸ など
  36. どういう形のターゲットでマルチモジュール化 まとめ ▸ Build Phasesなくても困らない ▸ Swift Package ▸ Build

    Phasesが必須 ▸ Static Library + Bundle + Dynamic Framework(Xcode Previews⽤) ▸ Tuist使えば簡単にできる
  37. MULTI-MODULE 101 参考資料 ▸ Overview of Dynamic Libraries ▸ Optimizing

    App Startup Time