コンフリクト発生頻度を減らすためにiOSアプリをモジュール化した
はじめに
iOS開発ではXcodeプロジェクト直下のファイルの作成、削除、移動の際に毎回更新されるproject.pbxproj
によって、コンフリクトが発生しやすいです。今回はこの問題を解消するためにコードの大部分をSwift Packageでモジュール化しました。
やったこと
1.ローカルパッケージの作成
コードを移すためのローカルパッケージを作成しました。(👇の資料に作成方法がまとまっています)
2.Xcodeワークスペースの作成
今まで使っていたXcodeプロジェクトファイルと、新規作成したローカルパッケージをXcodeワークスペース(.xcworkspace
)に含めるように変更しました。
理由は以下の2つがあります。
- Xcodeのプロジェクトツリーで新規作成したパッケージが他のパッケージに埋もれてしまい、編集対象だと気づきにくくなる
- ローカルパッケージパッケージのテストターゲットを Xcode Test Plansで管理できない
3.コードの大部分をローカルパッケージに移動
既存のコードをローカルパッケージ内のSources
フォルダとTests
フォルダに移動しました。一部Xcodeプロジェク下に残さないといけないファイル(AppDelegate
等)に関しても、ローカルパッケージのtargetをimportし継承する形にして、実態はローカルパッケージになるべく置くようにしました。
パッケージ間の依存管理やライブラリのバージョン管理はPackage.swift
で記述しました。
今後モジュールを分離し依存関係を整理していくのであれば、このローカルパッケージ下のtargetを分割して実現していく予定です。(参考)
おまけ.ビルド時などに動かしていたCLIツールをSPMに置き換え
モジュール分離によってPackage.swift
でライブラリの管理できるようになりました。そのため、SwiftGen
やSwiftLint
などのビルド時にCLIで実行していたライブラリをSPMに置き換えました。この対応によってライブラリはすべてSPMでの管理に移行することができました。(👇の資料に作業内容がまとまっています)
まとめ
今回はproject.pbxproj
でのコンフリクトを減らすことを目的に、コードのモジュール分離をしました。直近で取り組んでいるプロジェクトでもiOSの複数人開発する機会があったのですが、コンフリクトが起こることなくスムーズに開発することができました。
今回のスコープはコンフリクトの発生頻度を減らすことだけにとどめましたが、今後はマルチモジュール化による依存関係の整理も行なっていきたいと思います。
さいごに
このモジュール分離対応は僕が2月に1週間の休暇をいただいている間に、方針の決定から作業まで業務委託の(@temoki)さんに全面的に対応いただきました。いつもFANTS iOSアプリの開発にご協力いただきありがとうございます!
Discussion