Slide 1

Slide 1 text

© 2024 Wantedly, Inc. Swift Package Manager へ移行した話 Mobile勉強会 Wantedly × チームラボ × Sansan #13 Mar. 5 2024 - 林達也

Slide 2

Slide 2 text

© 2024 Wantedly, Inc. 自己紹介

Slide 3

Slide 3 text

© 2024 Wantedly, Inc. © 2024 Wantedly, Inc. 提供プロダクト

Slide 4

Slide 4 text

© 2024 Wantedly, Inc. 今までのプロジェクト構成

Slide 5

Slide 5 text

© 2024 Wantedly, Inc. 今までのプロジェクト構成 ● Xcode のターゲットとしてレイヤードアーキテクチャなモジュール分割 ● SwiftUI の導入とともにフィーチャー単位でのモジュールも段階的に導入 ● CocoaPods と Swift Package Manager (SwiftPM) でのライブラリが 混在

Slide 6

Slide 6 text

© 2024 Wantedly, Inc. 1. project.yml ● 各 Framework は XcodeGen の ターゲットで定義

Slide 7

Slide 7 text

© 2024 Wantedly, Inc. 2. Podfile ● そのターゲットを Podfile に取り込み プロジェクトをセットアップ

Slide 8

Slide 8 text

© 2024 Wantedly, Inc. 今までの課題 ● CocoaPods では複雑なターゲット構成の実現が難しい ● ソースファイルが Xcode プロジェクトに紐づいているため ブランチを切り替えると XcodeGen の実行が必要 ● すでにいくつかのライブラリが SwiftPM に移行されていて Podfile と project.yml の2つで管理する状況

Slide 9

Slide 9 text

© 2024 Wantedly, Inc. 目指したいプロジェクト構成

Slide 10

Slide 10 text

© 2024 Wantedly, Inc. 目指したいプロジェクト構成 ● Xcode のターゲットを SwiftPM のターゲットで定義 ● それらをまとめた SwiftPM のライブラリを定義 ● アプリケーションとそのライブラリとの関連付けは引き続き XcodeGen を利用 Package.swift

Slide 11

Slide 11 text

© 2024 Wantedly, Inc. タイムライン issue 化 ライブラリ移 行再開 コード調整 Package.swift へ切り替え 2022/4 2023/5 2023/12 2024/2

Slide 12

Slide 12 text

© 2024 Wantedly, Inc. タイムライン issue 化 ライブラリ移 行再開 コード調整 Package.swift へ切り替え 2022/4 2023/5 2023/12 2024/2

Slide 13

Slide 13 text

© 2024 Wantedly, Inc. タイムライン issue 化 ライブラリ移 行再開 コード調整 Package.swift へ切り替え 2022/4 2023/5 2023/12 2024/2 ● 主に 2023/5 からの取り組みについて要点を紹介

Slide 14

Slide 14 text

© 2024 Wantedly, Inc. ライブラリ移行

Slide 15

Slide 15 text

© 2024 Wantedly, Inc. ライブラリ移行 ● 移行のしやすい独立した依存のものから ● 基本は元のバージョンに合わせつつ SwiftPM サポートバージョンにアップデートし ながら移行 ● リンクや Xcode プレビューが失敗するものは後回し ● →最終的に FacebookSDK や RxSwift とそれに依存するライブラリが残る

Slide 16

Slide 16 text

© 2024 Wantedly, Inc. コード調整

Slide 17

Slide 17 text

© 2024 Wantedly, Inc. コード調整 ● アプリケーションターゲット以外で #if を利用した分岐があった ● →Xcode で定義したプリプロセッサシ ンボルが SwiftPM のターゲットでは 参照できない

Slide 18

Slide 18 text

© 2024 Wantedly, Inc. コード調整 ● アプリケーションターゲット以外で #if を利用した分岐があった ● →Xcode で定義したプリプロセッサシ ンボルが SwiftPM のターゲットでは 参照できない ● →参照している箇所を DI コンテナか ら取り出すようにひとつづつ置き換え

Slide 19

Slide 19 text

© 2024 Wantedly, Inc. 切り替え

Slide 20

Slide 20 text

© 2024 Wantedly, Inc. 切り替え ● Package.swift を用意し今までの Xcode ターゲットを SwiftPM ターゲットでも 定義 ● 既存のプロジェクトと並行して、両方のビルドが通るようにしながら進める ○ 場合によっては #if SWIFT_PACKAGE を利用しながら ● 🚧 ホストアプリケーションに依存した単体テストの存在 ○ テストを分割し調整 ● 🚧 コード生成に利用していた Sourcery を build tool plugin に置き換えたが CI のみ実行が失敗する ○ Notarization や Swift ベースのテンプレートによる内部での Swift ビルドに問題 ○ →既存のワークフローとなるべく変わらないように plugin をやめつつ実行タイミングを 変更

Slide 21

Slide 21 text

© 2024 Wantedly, Inc. まとめ

Slide 22

Slide 22 text

© 2024 Wantedly, Inc. まとめ ● 今までの課題が解消された ● 大きくハマった部分はないがトータルでは長期間な課題となった ○ どうしても施策を優先しがち ○ 月イチの負債返済日などを活用 ● 漸進的な移行が自分たちのチームでは正解だった ○ 並行して施策が動いているので大きな変更は取り込みづらい ○ 進めていくうちに気づかなかった課題に遭遇する ● これからより大きくカイゼンする環境が手に入った 🙌