Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Multi-Module 101
Search
Jierong Li
December 17, 2021
Programming
0
340
Multi-Module 101
どういう形のターゲットでマルチモジュール化について。
Jierong Li
December 17, 2021
Tweet
Share
More Decks by Jierong Li
See All by Jierong Li
一般的な通信でも使える バックグラウンドURLSessionの活用方法 / How to use background URLSession for general network data transfer tasks.
myihsan
0
2.6k
Hierarchical Structure について / About Hierarchical Structure
myihsan
1
510
What’s New in Accessibility WWDC21
myihsan
1
320
Property WrapperでDecodableのデフォルト値を設定 / Providing Default Value for Decodable Property by Property Wrapper
myihsan
1
310
モックフレームワーク比較 / Mocking Framework Comparison
myihsan
0
520
Other Decks in Programming
See All in Programming
複数チーム並行開発下でのコード移行アプローチ ~手動 Codemod から「生成AI 活用」への進化
andpad
0
170
Atomics APIを知る / Understanding Atomics API
ssssota
1
150
Web エンジニアが JavaScript で AI Agent を作る / JSConf JP 2025 sponsor session
izumin5210
4
1.8k
早すぎ?超先読み Go 1.26 Draft - Preview the contents of the Go 1.26 Draft Release Notes
tomtwinkle
0
320
Bakuraku E2E Scenario Test System Architecture #bakuraku_qa_study
teyamagu
PRO
0
770
Register is more than clipboard
satorunooshie
1
480
知られているようで知られていない JavaScriptの仕様 4選
syumai
0
620
All(?) About Point Sets
hole
0
180
詳細の決定を遅らせつつ実装を早くする
shimabox
1
1.3k
JEP 496 と JEP 497 から学ぶ耐量子計算機暗号入門 / Learning Post-Quantum Crypto Basics from JEP 496 & 497
mackey0225
2
390
What’s Fair is FAIR: A Decentralised Future for WordPress Distribution
rmccue
0
190
Designing Repeatable Edits: The Architecture of . in Vim
satorunooshie
0
400
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Unsuck your backbone
ammeep
671
58k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
KATA
mclloyd
PRO
32
15k
RailsConf 2023
tenderlove
30
1.3k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
How STYLIGHT went responsive
nonsquared
100
5.9k
Being A Developer After 40
akosma
91
590k
A Modern Web Designer's Workflow
chriscoyier
697
190k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Transcript
MULTI-MODULE 101 YUMEMI.SWIFT #14 〜今年の振り返り〜
⾃⼰紹介 JIERONG LI (李) ▸ 株式会社ゆめみ ▸ iOSエンジニア ▸ 永遠にリリースできず個⼈開発
▸ https://jierong.dev
MULTI-MODULE?
MULTI-MODULE 101 MULTI-MODULE?
MULTI-TARGET?
None
None
None
None
マルチモジュール
メリット
マルチモジュール メリット ▸ アプリから独⽴できる ▸ ビルドが早い ▸ プレビューが早い ▸ テストが早い
▸ アプリ起動なしでテスト実⾏できる ▸ ある程度疎結合な設計が強いられる
マルチモジュール ハードル ▸ どういう形のターゲットでマルチモジュール化 ▸ マルチジュールしやすい設計 ▸ 疎結合 ▸ 循環依存がない
▸ など
マルチモジュール ハードル ▸ どういう形のターゲットでマルチモジュール化 ▸ マルチジュールしやすい設計 ▸ 疎結合 ▸ 循環依存がない
▸ など
どういう形のターゲット でマルチモジュール化
None
LIBRARY OR FRAMEWORK
LIBRARY OR FRAMEWORK リソースが持てるかどうか Target Membershipにチェック⼊れることすらできない
DYNAMIC OR STATIC
DYNAMIC OR STATIC (DYNAMIC) FRAMEWORK ▸ .frameworkとしてembedされる ▸ 起動時に動的にロードされる(dyld) ▸
Info.plistなどのリソースが含まれる
DYNAMIC OR STATIC STATIC LIBRARY ▸ .framework的なもの⾒当たらない ▸ Static Library
Link前後の実⾏ファイル(MultiModul) のサイズ ▸ 前:95,664 bytes ▸ 後:95,920 bytes ▸ 実⾏ファイルとしてビルドされる ▸ 動的ロードする時間がかからない ▸ 複数な実⾏ファイルがある場合サイズが数倍になる
DYNAMIC OR STATIC DYNAMIC LIBRARY AND STATIC FRAMEWORK? ▸ Dynamic
Library ▸ 仕組み上可能だけど、Dynamic Frameworkと同じように動的ロードする時間が必要な ら、リソース持てるFrameworkの⽅を使うのが便利 ▸ Static Framework ▸ Frameworkをembedしないとリソースが持てない ▸ ソースコードがアプリ実⾏ファイルとしてビルドされる ▸ Bundle(for: SomeClass.self)のようにFrameworkのBundleをアクセスできなくなる
どういう形のターゲットでマルチモジュール化 DYNAMIC FRAMEWORK OR STATIC LIBRARY ▸ OS X時期 ▸
実⾏ファイルサイズ削減視点で、Dynamicが推奨されたけど ▸ WWDC 2016:Overview of Dynamic Libraries ▸ 実⾏効率視点で、Staticが推奨された ▸ 総合的に ▸ Staticが優先 ▸ 実⾏ファイルサイズを考慮するなど⽌むを得ない場合Dynamic
動的ロードする時間を省け たいけど、リソースも持た せたい どういう形のターゲットでマルチモジュール化
None
動的ロードする時間を省けたいけど、リソースも持たせたい 対策 ▸ Static Libraryでターゲットを作成 ▸ 別途Bundle(macOS)ターゲットでリソースを持たせる ▸ BundleName.bundleというファイルがアプリに含まれ ▸
Bundle.main.resourceURL?.appendingPathComponent(bundleName + ".bundle")で直接参照
動的ロードする時間を省けたいけど、リソースも持たせたい 問題 ▸ ⼿間がかかる ▸ Tuistがやってくれる ▸ Static LibraryではXcode Previewsが使えない
▸ 別途Xcode Previews⽤に同じDynamic Framework作成 ▸ さらに⼿間がかかる ▸ XcodeGenとTuistのようなXcode Project⽣成するツールであれば割と簡単 ▸ はたして正規⼿段か?
もう⼀つターゲットの形 SWIFT PACKAGE ▸ Xcode Previews使える ▸ swift-tools-version:5.3以降であればリソースが持たせる
SWIFT PACKAGE DYNAMIC OR STATIC ▸ library(name:type:targets:)のtypeによって決められる ▸ nilの場合DynamicとStatic両⽅可能、Xcodeが決めてくれる ▸
Xcodeの決め⽅ ▸ Static優先 ▸ duplicate symbols回避するためにDynamic ▸ 例:アプリとアプリにリンクされたDynamic Frameworkに使われた場合
SWIFT PACKAGE DYNAMICリンクされた場合
SWIFT PACKAGE STATICリンクされた場合
それぞれDYNAMIC FRAMEWORK とSTATIC LIBRARYと⼀緒で、STATIC リンクされ た場合リソースどう持たせるの? SWIFT PACKAGE
SWIFT PACKAGE リソースの持ち⽅ ▸ Bundleに持たせる ▸ あらゆるケースを想定し Bundle.moduleを提供
⾯倒ことせずにリソースを持てる し、XCODE PREVIEWSも使えるので、 SWIFT PACKAGEでいいんじゃない? SWIFT PACKAGE
SWIFT PACKAGE BUILD PHASESがない ▸ ビルド前後⾊々できない(しにくい) ▸ コード⽣成 ▸ Lint
▸ など
どういう形のターゲットでマルチモジュール化 まとめ ▸ Build Phasesなくても困らない ▸ Swift Package ▸ Build
Phasesが必須 ▸ Static Library + Bundle + Dynamic Framework(Xcode Previews⽤) ▸ Tuist使えば簡単にできる
MULTI-MODULE 101 参考資料 ▸ Overview of Dynamic Libraries ▸ Optimizing
App Startup Time