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
SwiftPM マルチモジュール構成への第一歩
Search
tatsubee
March 28, 2024
0
1.8k
SwiftPM マルチモジュール構成への第一歩
tatsubee
March 28, 2024
Tweet
Share
More Decks by tatsubee
See All by tatsubee
pixivのリアーキテクチャにおける The Composable Architecter活用
shoryuyamamoto
0
67
pixivアプリは変化する
shoryuyamamoto
0
170
マルチウィンドウでアプリケーションの表現を拡張する
shoryuyamamoto
1
110
【After iOSDC LT Night〜ピクシブ×日経×タイミー〜】実装!Interactive Widgets
shoryuyamamoto
0
13
TCA with UIKit [TCAでわいわいLT会]
shoryuyamamoto
1
770
Dart Macrosに願いを [YOUTRUST x ゆめみ Flutter LT会@渋谷 #4]
shoryuyamamoto
0
620
riverpodを理解したい
shoryuyamamoto
0
84
pixiv-iosを破壊したい #pixivmeetup
shoryuyamamoto
0
1.3k
キャッチアップ!The Composable Architecture
shoryuyamamoto
1
350
Featured
See All Featured
For a Future-Friendly Web
brad_frost
174
9.4k
Thoughts on Productivity
jonyablonski
67
4.3k
Art, The Web, and Tiny UX
lynnandtonic
296
20k
Happy Clients
brianwarren
97
6.7k
Writing Fast Ruby
sferik
626
60k
Building Better People: How to give real-time feedback that sticks.
wjessup
363
19k
Into the Great Unknown - MozCon
thekraken
31
1.4k
How STYLIGHT went responsive
nonsquared
95
5.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
41
2.1k
Six Lessons from altMBA
skipperchong
26
3.4k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
How GitHub (no longer) Works
holman
311
140k
Transcript
SwiftPM マルチモジュール 構成への第一歩 pixiv Inc. tatsubee 2024.03.27
2 自己紹介 • iOSエンジニアとして新卒入社 • 福岡生まれ 福岡育ち 東京在住 • 最近やっていること
◦ pixiv-iosの開発 ◦ お絵描き ◦ テニス tatsubee pixiv事業本部 ユーティリティユニット アプリ部 エンジニア
3 SwiftPM マルチモジュール 構成への第一歩
4 (ほぼ)全ファイルを Legacyモジュールへ移行
5 Legacyモジュールへの移行 前提: 当時のpixiv-ios • UIKit • ファイル数: 2500 •
ライブラリ管理: SwiftPM + CocoaPods
6 Legacyモジュールへの移行 移行の結果 • UIKit • 2500ファイルの移行によるクラッシュ無し! • ライブラリ管理: Package.swift
• .pbxprojファイルのConflictから解放
7 Legacyモジュール移行の 手順
8 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動
b. 必要なimport文の補完 c. public化 d. Resourceファイルを修正 e. Testsを修正
9 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動
b. 必要なimport文の補完 c. public化 d. Resourceファイルを修正 e. Testsを修正
10 ライブラリをPackage.swiftで管理 ライブラリの管理方法 • SwiftPM • CocoaPods • XCFramework •
Carthage
11 ライブラリをPackage.swiftで管理 ライブラリの管理方法 • SwiftPM • CocoaPods • XCFramework •
Carthage SwiftPM
12 ライブラリをPackage.swiftで管理 ライブラリの管理方法 • SwiftPM • CocoaPods • XCFramework •
Carthage(pixiv-iosの中では使っていない) SwiftPM
13 ライブラリをPackage.swiftで管理 ライブラリの管理方法 • SwiftPM • CocoaPods • XCFramework •
Carthage(pixiv-iosの中では使っていない) Package.swift (SwiftPM + XCFramework)
14 ライブラリをPackage.swiftで管理 ライブラリの管理方法 • SwiftPM • CocoaPods • XCFramework •
Carthage(pixiv-iosの中では使っていない) やること: CocoaPodsを取り除く Package.swift (SwiftPM + XCFramework)
15 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動
b. 必要なimport文の補完 c. public化 d. Resourceファイルを修正 e. Testsを修正
16 初期画面を準備 • 起動後最初の画面はLegacyモジュールではなくプロジェクト下に存 在する必要がある • pixiv-iosでは最初の画面であるRootContainerViewControllerが 様々な役割を持っていたため、それをプロジェクト下に置きたくない • ので、最初の画面としての役割だけを持たせたMainViewController
を用意
17 初期画面を準備
18 初期画面を準備 ⚠注意⚠ pixiv-iosでは次のような実装があった このままではクラッシュしてしまうので修正しよう
19 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動
b. 必要なimport文の補完 c. public化 d. Resourceファイルを修正 e. Testsを修正
20 ファイルの移動・import補完・public化 • ファイルの移動 ◦ 全てのファイルを何も考えず移動! • importの補完 ◦ プロジェクト下で管理していた時は`import
UIKit`等は明記しな くても問題なかったが、モジュール下では明記する必要がある ◦ 脳死でひたすらimport… • public化 ◦ モジュール外から呼び出す必要のあるものはpublicにする
21 ファイルの移動・import補完・public化 • ファイルの移動 • import補完 • public化 これらが完了した時点でビルド可能 逆に言えば、不備があった場合にはコンパイルエラーを起こすので安心
22 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動
b. 必要なimport文の補完 c. public化 d. Resourceファイルを修正 e. Testsを修正
23 Resourceファイルを修正 ⚠重要⚠ 不備があってもコンパイルエラーを起こさないため 網羅的な検証が必要!
24 Resourceファイルを修正 Resource: 画像や色の定義、文字列等のAsset + Storyboard、Xib
25 Resourceファイルを修正 • Resourceの置き場所 • Storyboard・XibファイルのcustomModule • Bundle.main
26 Resourceファイルを修正 • Resourceの置き場所 ◦ 基本として、xcassets等のResourceファイルは使用するモ ジュール内に設置しよう ◦ Wrapperを作って外部に公開することもできる
27 Resourceファイルを修正 • Storyboard・XibファイルのcustomModule ◦ ファイル内の`customModule`というタグによって、StoryBoard をどのモジュールで使用するかを指定している
28 Resourceファイルを修正 • Storyboard・XibファイルのcustomModule ◦ ファイル内の`customModule`というタグによって、StoryBoard をどのモジュールで使用するかを指定している
29 Resourceファイルを修正 • Storyboard・XibファイルのcustomModule ◦ ファイル内の`customModule`というタグによって、StoryBoard をどのモジュールで使用するかを指定している
30 Resourceファイルを修正 • Storyboard・XibファイルのcustomModule ◦ ファイル内の`customModule`というタグによって、StoryBoard をどのモジュールで使用するかを指定している ◦ VSCodeでcustomModule=”pixiv”で検索をかけ、全て置換した
31 Resourceファイルを修正 • Bundle.main ◦ Xibやその他Resourceファイルを扱うときに、どのBundleかを指 定しているのでmoduleを指定してあげよう ◦ よく見たのが次のパターン
32 Resourceファイルを修正 • Resourceの置き場所 • Storyboard・XibファイルのcustomModule • Bundle.main これらが不備なくできているなら プロダクトとしてはリリース可能な状態
33 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動
b. 必要なimportの補完 c. public化 d. Resourceファイルを修正 e. Testsを修正
34 Testsを修正 • テストファイルを全てTests/LegacyTests下に移動 • @testable import pixiv → @testable
import Legacyへ置換 • 元のTestsのターゲットを削除
35 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動
b. 必要なimportの補完 c. public化 d. Resourceファイルを修正 e. Testsを修正
36 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動
b. 必要なimportの補完 c. public化 d. Resourceファイルを修正 e. Testsを修正 omplete
37 Legacyモジュールへの移行 移行の結果(再掲) • 2500ファイルの移行によるクラッシュ無し! • ライブラリ管理: Package.swift • .pbxprojファイルのConflictから解放
38 マルチモジュール化へ向けて 現状の課題: • 循環参照がいっぱい • 結合がめっちゃ密 これから • 新規の画面はモジュールとして作成
• 根本の部分もモジュールとして作り直し、徐々に置き換えていく
39 マルチモジュール化へ向けて 所感 • Legacyモジュールへの移行は恩恵があるのでみんなでバッと取り組 むのは良さそう! • マルチモジュール構成化は今すぐに手をつけて完了させるというより は、常に意識して疎に設計しつつ、徐々に形作っていこう これができれば将来、過去の自分に感謝するはず
40 最後に
41 一緒にpixivを創る仲間を募集しています! 最後に
42 pixiv-iosがやりたいこと • リアーキテクチャ • 既存機能の改善 ◦ プッシュ通知 ◦ 検索機能
• 新規機能の実装 • etc... いっしょにpixivをもっと楽しくしませんか?
43 ご清聴 ありがとう ございました!