Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

MULTI-MODULE?

Slide 4

Slide 4 text

MULTI-MODULE 101 MULTI-MODULE?

Slide 5

Slide 5 text

MULTI-TARGET?

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

マルチモジュール

Slide 11

Slide 11 text

メリット

Slide 12

Slide 12 text

マルチモジュール メリット ▸ アプリから独⽴できる ▸ ビルドが早い ▸ プレビューが早い ▸ テストが早い ▸ アプリ起動なしでテスト実⾏できる ▸ ある程度疎結合な設計が強いられる

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

LIBRARY OR 
 FRAMEWORK

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

DYNAMIC OR 
 STATIC

Slide 20

Slide 20 text

DYNAMIC OR STATIC (DYNAMIC) FRAMEWORK ▸ .frameworkとしてembedされる ▸ 起動時に動的にロードされる(dyld) ▸ Info.plistなどのリソースが含まれる

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

どういう形のターゲットでマルチモジュール化 DYNAMIC FRAMEWORK OR STATIC LIBRARY ▸ OS X時期 ▸ 実⾏ファイルサイズ削減視点で、Dynamicが推奨されたけど ▸ WWDC 2016:Overview of Dynamic Libraries ▸ 実⾏効率視点で、Staticが推奨された ▸ 総合的に ▸ Staticが優先 ▸ 実⾏ファイルサイズを考慮するなど⽌むを得ない場合Dynamic

Slide 24

Slide 24 text

動的ロードする時間を省け たいけど、リソースも持た せたい どういう形のターゲットでマルチモジュール化

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

動的ロードする時間を省けたいけど、リソースも持たせたい 問題 ▸ ⼿間がかかる ▸ Tuistがやってくれる ▸ Static LibraryではXcode Previewsが使えない ▸ 別途Xcode Previews⽤に同じDynamic Framework作成 ▸ さらに⼿間がかかる ▸ XcodeGenとTuistのようなXcode Project⽣成するツールであれば割と簡単 ▸ はたして正規⼿段か?

Slide 28

Slide 28 text

もう⼀つターゲットの形 SWIFT PACKAGE ▸ Xcode Previews使える ▸ swift-tools-version:5.3以降であればリソースが持たせる

Slide 29

Slide 29 text

SWIFT PACKAGE DYNAMIC OR STATIC ▸ library(name:type:targets:)のtypeによって決められる ▸ nilの場合DynamicとStatic両⽅可能、Xcodeが決めてくれる ▸ Xcodeの決め⽅ ▸ Static優先 ▸ duplicate symbols回避するためにDynamic ▸ 例:アプリとアプリにリンクされたDynamic Frameworkに使われた場合

Slide 30

Slide 30 text

SWIFT PACKAGE DYNAMICリンクされた場合

Slide 31

Slide 31 text

SWIFT PACKAGE STATICリンクされた場合

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

どういう形のターゲットでマルチモジュール化 まとめ ▸ Build Phasesなくても困らない ▸ Swift Package ▸ Build Phasesが必須 ▸ Static Library + Bundle + Dynamic Framework(Xcode Previews⽤) ▸ Tuist使えば簡単にできる

Slide 37

Slide 37 text

MULTI-MODULE 101 参考資料 ▸ Overview of Dynamic Libraries ▸ Optimizing App Startup Time