Slide 1

Slide 1 text

SwiftPM マルチモジュール 構成への第一歩 pixiv Inc. tatsubee 2024.03.27

Slide 2

Slide 2 text

2 自己紹介 ● iOSエンジニアとして新卒入社 ● 福岡生まれ 福岡育ち 東京在住 ● 最近やっていること ○ pixiv-iosの開発 ○ お絵描き ○ テニス tatsubee pixiv事業本部 ユーティリティユニット アプリ部 エンジニア

Slide 3

Slide 3 text

3 SwiftPM マルチモジュール 構成への第一歩

Slide 4

Slide 4 text

4 (ほぼ)全ファイルを Legacyモジュールへ移行

Slide 5

Slide 5 text

5 Legacyモジュールへの移行 前提: 当時のpixiv-ios ● UIKit ● ファイル数: 2500 ● ライブラリ管理: SwiftPM + CocoaPods

Slide 6

Slide 6 text

6 Legacyモジュールへの移行 移行の結果 ● UIKit ● 2500ファイルの移行によるクラッシュ無し! ● ライブラリ管理: Package.swift ● .pbxprojファイルのConflictから解放

Slide 7

Slide 7 text

7 Legacyモジュール移行の 手順

Slide 8

Slide 8 text

8 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動 b. 必要なimport文の補完 c. public化 d. Resourceファイルを修正 e. Testsを修正

Slide 9

Slide 9 text

9 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動 b. 必要なimport文の補完 c. public化 d. Resourceファイルを修正 e. Testsを修正

Slide 10

Slide 10 text

10 ライブラリをPackage.swiftで管理 ライブラリの管理方法 ● SwiftPM ● CocoaPods ● XCFramework ● Carthage

Slide 11

Slide 11 text

11 ライブラリをPackage.swiftで管理 ライブラリの管理方法 ● SwiftPM ● CocoaPods ● XCFramework ● Carthage SwiftPM

Slide 12

Slide 12 text

12 ライブラリをPackage.swiftで管理 ライブラリの管理方法 ● SwiftPM ● CocoaPods ● XCFramework ● Carthage(pixiv-iosの中では使っていない) SwiftPM

Slide 13

Slide 13 text

13 ライブラリをPackage.swiftで管理 ライブラリの管理方法 ● SwiftPM ● CocoaPods ● XCFramework ● Carthage(pixiv-iosの中では使っていない) Package.swift (SwiftPM + XCFramework)

Slide 14

Slide 14 text

14 ライブラリをPackage.swiftで管理 ライブラリの管理方法 ● SwiftPM ● CocoaPods ● XCFramework ● Carthage(pixiv-iosの中では使っていない) やること: CocoaPodsを取り除く Package.swift (SwiftPM + XCFramework)

Slide 15

Slide 15 text

15 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動 b. 必要なimport文の補完 c. public化 d. Resourceファイルを修正 e. Testsを修正

Slide 16

Slide 16 text

16 初期画面を準備 ● 起動後最初の画面はLegacyモジュールではなくプロジェクト下に存 在する必要がある ● pixiv-iosでは最初の画面であるRootContainerViewControllerが 様々な役割を持っていたため、それをプロジェクト下に置きたくない ● ので、最初の画面としての役割だけを持たせたMainViewController を用意

Slide 17

Slide 17 text

17 初期画面を準備

Slide 18

Slide 18 text

18 初期画面を準備 ⚠注意⚠ pixiv-iosでは次のような実装があった このままではクラッシュしてしまうので修正しよう

Slide 19

Slide 19 text

19 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動 b. 必要なimport文の補完 c. public化 d. Resourceファイルを修正 e. Testsを修正

Slide 20

Slide 20 text

20 ファイルの移動・import補完・public化 ● ファイルの移動 ○ 全てのファイルを何も考えず移動! ● importの補完 ○ プロジェクト下で管理していた時は`import UIKit`等は明記しな くても問題なかったが、モジュール下では明記する必要がある ○ 脳死でひたすらimport… ● public化 ○ モジュール外から呼び出す必要のあるものはpublicにする

Slide 21

Slide 21 text

21 ファイルの移動・import補完・public化 ● ファイルの移動 ● import補完 ● public化 これらが完了した時点でビルド可能 逆に言えば、不備があった場合にはコンパイルエラーを起こすので安心

Slide 22

Slide 22 text

22 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動 b. 必要なimport文の補完 c. public化 d. Resourceファイルを修正 e. Testsを修正

Slide 23

Slide 23 text

23 Resourceファイルを修正 ⚠重要⚠ 不備があってもコンパイルエラーを起こさないため 網羅的な検証が必要!

Slide 24

Slide 24 text

24 Resourceファイルを修正 Resource: 画像や色の定義、文字列等のAsset + Storyboard、Xib

Slide 25

Slide 25 text

25 Resourceファイルを修正 ● Resourceの置き場所 ● Storyboard・XibファイルのcustomModule ● Bundle.main

Slide 26

Slide 26 text

26 Resourceファイルを修正 ● Resourceの置き場所 ○ 基本として、xcassets等のResourceファイルは使用するモ ジュール内に設置しよう ○ Wrapperを作って外部に公開することもできる

Slide 27

Slide 27 text

27 Resourceファイルを修正 ● Storyboard・XibファイルのcustomModule ○ ファイル内の`customModule`というタグによって、StoryBoard をどのモジュールで使用するかを指定している

Slide 28

Slide 28 text

28 Resourceファイルを修正 ● Storyboard・XibファイルのcustomModule ○ ファイル内の`customModule`というタグによって、StoryBoard をどのモジュールで使用するかを指定している

Slide 29

Slide 29 text

29 Resourceファイルを修正 ● Storyboard・XibファイルのcustomModule ○ ファイル内の`customModule`というタグによって、StoryBoard をどのモジュールで使用するかを指定している

Slide 30

Slide 30 text

30 Resourceファイルを修正 ● Storyboard・XibファイルのcustomModule ○ ファイル内の`customModule`というタグによって、StoryBoard をどのモジュールで使用するかを指定している ○ VSCodeでcustomModule=”pixiv”で検索をかけ、全て置換した

Slide 31

Slide 31 text

31 Resourceファイルを修正 ● Bundle.main ○ Xibやその他Resourceファイルを扱うときに、どのBundleかを指 定しているのでmoduleを指定してあげよう ○ よく見たのが次のパターン

Slide 32

Slide 32 text

32 Resourceファイルを修正 ● Resourceの置き場所 ● Storyboard・XibファイルのcustomModule ● Bundle.main これらが不備なくできているなら プロダクトとしてはリリース可能な状態

Slide 33

Slide 33 text

33 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動 b. 必要なimportの補完 c. public化 d. Resourceファイルを修正 e. Testsを修正

Slide 34

Slide 34 text

34 Testsを修正 ● テストファイルを全てTests/LegacyTests下に移動 ● @testable import pixiv → @testable import Legacyへ置換 ● 元のTestsのターゲットを削除

Slide 35

Slide 35 text

35 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動 b. 必要なimportの補完 c. public化 d. Resourceファイルを修正 e. Testsを修正

Slide 36

Slide 36 text

36 Legacyモジュール移行の手順 1. ライブラリをPackage.swiftで管理するよう移行 2. Legacyモジュールを繋ぎこむためだけの初期画面を準備 3. ファイル群をLegacyモジュールに移行 a. ファイルの移動 b. 必要なimportの補完 c. public化 d. Resourceファイルを修正 e. Testsを修正 omplete

Slide 37

Slide 37 text

37 Legacyモジュールへの移行 移行の結果(再掲) ● 2500ファイルの移行によるクラッシュ無し! ● ライブラリ管理: Package.swift ● .pbxprojファイルのConflictから解放

Slide 38

Slide 38 text

38 マルチモジュール化へ向けて 現状の課題: ● 循環参照がいっぱい ● 結合がめっちゃ密 これから ● 新規の画面はモジュールとして作成 ● 根本の部分もモジュールとして作り直し、徐々に置き換えていく

Slide 39

Slide 39 text

39 マルチモジュール化へ向けて 所感 ● Legacyモジュールへの移行は恩恵があるのでみんなでバッと取り組 むのは良さそう! ● マルチモジュール構成化は今すぐに手をつけて完了させるというより は、常に意識して疎に設計しつつ、徐々に形作っていこう これができれば将来、過去の自分に感謝するはず

Slide 40

Slide 40 text

40 最後に

Slide 41

Slide 41 text

41 一緒にpixivを創る仲間を募集しています!
 最後に

Slide 42

Slide 42 text

42 pixiv-iosがやりたいこと ● リアーキテクチャ ● 既存機能の改善 ○ プッシュ通知 ○ 検索機能 ● 新規機能の実装 ● etc... いっしょにpixivをもっと楽しくしませんか?

Slide 43

Slide 43 text

43 ご清聴 ありがとう ございました!