Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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