💥

コンフリクト発生頻度を減らすためにiOSアプリをモジュール化した

2024/04/26に公開

はじめに

iOS開発ではXcodeプロジェクト直下のファイルの作成、削除、移動の際に毎回更新されるproject.pbxprojによって、コンフリクトが発生しやすいです。今回はこの問題を解消するためにコードの大部分をSwift Packageでモジュール化しました。

やったこと

1.ローカルパッケージの作成

コードを移すためのローカルパッケージを作成しました。(👇の資料に作成方法がまとまっています)
https://speakerdeck.com/temoki/swift-package-manager-niyorumarutimoziyurugou-cheng?slide=14

2.Xcodeワークスペースの作成

今まで使っていたXcodeプロジェクトファイルと、新規作成したローカルパッケージをXcodeワークスペース(.xcworkspace)に含めるように変更しました。

理由は以下の2つがあります。

  • Xcodeのプロジェクトツリーで新規作成したパッケージが他のパッケージに埋もれてしまい、編集対象だと気づきにくくなる
  • ローカルパッケージパッケージのテストターゲットを Xcode Test Plansで管理できない

3.コードの大部分をローカルパッケージに移動

既存のコードをローカルパッケージ内のSourcesフォルダとTestsフォルダに移動しました。一部Xcodeプロジェク下に残さないといけないファイル(AppDelegate等)に関しても、ローカルパッケージのtargetをimportし継承する形にして、実態はローカルパッケージになるべく置くようにしました。

パッケージ間の依存管理やライブラリのバージョン管理はPackage.swiftで記述しました。

今後モジュールを分離し依存関係を整理していくのであれば、このローカルパッケージ下のtargetを分割して実現していく予定です。(参考)

おまけ.ビルド時などに動かしていたCLIツールをSPMに置き換え

モジュール分離によってPackage.swiftでライブラリの管理できるようになりました。そのため、SwiftGenSwiftLintなどのビルド時にCLIで実行していたライブラリをSPMに置き換えました。この対応によってライブラリはすべてSPMでの管理に移行することができました。(👇の資料に作業内容がまとまっています)
https://speakerdeck.com/temoki/iospatukezimaneziyafen-dou-ji-wan-jie-bian?slide=7

まとめ

今回はproject.pbxprojでのコンフリクトを減らすことを目的に、コードのモジュール分離をしました。直近で取り組んでいるプロジェクトでもiOSの複数人開発する機会があったのですが、コンフリクトが起こることなくスムーズに開発することができました。

今回のスコープはコンフリクトの発生頻度を減らすことだけにとどめましたが、今後はマルチモジュール化による依存関係の整理も行なっていきたいと思います。

さいごに

このモジュール分離対応は僕が2月に1週間の休暇をいただいている間に、方針の決定から作業まで業務委託の(@temoki)さんに全面的に対応いただきました。いつもFANTS iOSアプリの開発にご協力いただきありがとうございます!

GitHubで編集を提案
株式会社スタジアム

Discussion