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
360
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Multi-Module 101
どういう形のターゲットでマルチモジュール化について。
Jierong Li
December 17, 2021
More Decks by Jierong Li
See All by Jierong Li
一般的な通信でも使える バックグラウンドURLSessionの活用方法 / How to use background URLSession for general network data transfer tasks.
myihsan
0
3k
Hierarchical Structure について / About Hierarchical Structure
myihsan
1
530
What’s New in Accessibility WWDC21
myihsan
1
340
Property WrapperでDecodableのデフォルト値を設定 / Providing Default Value for Decodable Property by Property Wrapper
myihsan
1
360
モックフレームワーク比較 / Mocking Framework Comparison
myihsan
0
550
Other Decks in Programming
See All in Programming
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
240
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
580
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.1k
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.2k
Oxcを導入して開発体験が向上した話
yug1224
4
310
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Lessons from Spec-Driven Development
simas
PRO
0
200
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
350
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
160
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
250
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
2k
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Between Models and Reality
mayunak
4
340
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
How STYLIGHT went responsive
nonsquared
100
6.2k
Design in an AI World
tapps
1
240
BBQ
matthewcrist
89
10k
Code Reviewing Like a Champion
maltzj
528
40k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
200
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
Automating Front-end Workflow
addyosmani
1370
210k
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