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
260
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
1.2k
Hierarchical Structure について / About Hierarchical Structure
myihsan
1
410
What’s New in Accessibility WWDC21
myihsan
1
250
Property WrapperでDecodableのデフォルト値を設定 / Providing Default Value for Decodable Property by Property Wrapper
myihsan
1
240
モックフレームワーク比較 / Mocking Framework Comparison
myihsan
0
420
Other Decks in Programming
See All in Programming
検証も兼ねて個人開発でHonoとかと向き合った話
hanetsuki
0
810
DMMプラットフォームがTiDB Cloudを採用した背景
pospome
8
4k
1BRC--Nerd Sniping the Java Community
gunnarmorling
0
340
デフォルトにして至高、RubyMineの大好きな所
ruzia
0
290
Ruby Function Composition
bkuhlmann
1
330
Blue/Greenデプロイの導入による 運用フローの改善
kudoas
1
370
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
230
R言語の環境構築と基礎 Tokyo.R 112
bob3bob3
0
260
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.3k
Azure OpenAI Serviceのプロンプトエンジニアリング入門
tomokusaba
3
670
Site Reliability Engineering for GMO
pyama86
7
1k
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
Featured
See All Featured
Producing Creativity
orderedlist
PRO
337
39k
Designing the Hi-DPI Web
ddemaree
276
33k
GitHub's CSS Performance
jonrohan
1025
450k
Embracing the Ebb and Flow
colly
80
4.1k
Into the Great Unknown - MozCon
thekraken
10
990
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
6
1.5k
Designing on Purpose - Digital PM Summit 2013
jponch
110
6.5k
Being A Developer After 40
akosma
57
580k
What's new in Ruby 2.0
geeforr
337
31k
Stop Working from a Prison Cell
hatefulcrawdad
266
19k
Building Better People: How to give real-time feedback that sticks.
wjessup
355
18k
Optimizing for Happiness
mojombo
370
69k
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