マルチモジュールでxibやstoryboardでCustom Classの参照するモジュールの誤りを自動チェックする(Swift限定)


概要

昔、IBLinterにcontributeしたマルチモジュールでxibやstoryboardでCustom Classの参照するモジュールの誤りを自動チェックしてくれる機能を紹介します

IBLinter とはInterface Builder(以降はIB)に対するLintツールです。

その中の custom_module と言うルールを作りました。
custom_module ルールに対応しているのは、Swiftファイルで定義したCustom Classだけなので注意してください

IBでCustom Classに下記のように【Module】と言う蘭があります。ここは普段Class蘭の方にクラス名を入力すると自動的に
探し出して対象のモジュール名が自動入力されるのですが

このClassこっちのモジュールに移動しよう!!

とかなった時に単純にClassを移動させた場合、悲劇が起こりやすいです。
xibやstoryboardのxml内に設定されている【Module】蘭の情報は単純にClassを移動させた場合などは自動更新されないので、xibやstoryboardから移動させたClassを参照ができなくなるのですが、
なんとビルドエラーにならずビルドが通ってしまいます!!

そうするとxibやstoryboardから参照できなかった場所はCustom Classではなく単なる標準のClass(UIView)とかになって
【何も表示されない!!】と言う悲劇を招きやすいです。

そこでチェックする機構をIBLinterにcontributeして custom_module ルールを作りました。

設定方法

IBLinterのセットアップ 後、.iblinter.ymlcustom_module_ruleに下記のように自分の環境に合わせてに設定することでルールに従っていない場合はビルドエラーとすることができます。IBLinterのルールの適用外としたいフォルダはexcludedを設定すれば良いです

excluded: #IBLinterのルールの適用外としたいフォルダ(再帰的に配下のフォルダは全て対象外になります)、ここの指定以外のxibやstoryboardは全て対象になります
  - App/Classes/Config/Generated
custom_module_rule:
  - module: HogeUIComponents #【Module】蘭から参照されるモジュール名
    included: # Custom Classの定義されたSwiftファイルがあるフォルダ(再帰的に配下のフォルダは全て対象になります)
      - HogeUIComponents/Classes
      - HogeUIComponents/Other
    excluded: # ↑のincluded内から対象外としたいフォルダ(再帰的に配下のフォルダは全て対象外になります)
      - HogeUIComponents/Classes/Config/Generated
      - HogeUIComponents/Classes/Config/Another
  - module: FugaUIComponents #複数登録可能
    included:
      - FugaUIComponents/Classes
    excluded:
      - FugaUIComponents/Classes/Config/Generated

上記のような設定をすれば

例えばHogeUIComponentsと言う名前のモジュールに

HogeUIComponents/Classes/AAA.swift

class HogeView {
   ...
}

と言うクラスを定義しており

App/Classes/FugaView.xib

FugaView.xib内でHogeViewをCustom Classで指定しているが、【Module】蘭がHogeUIComponentsじゃないとビルドエラーとしてくれます。

なのでAAA.swift(HogeView)HogeUIComponentsFugaUIComponentsにTarget変更し、FugaUIComponents/Classes/配下に移した場合

xibやstoryboard内でHogeViewをCustom Classで参照している箇所は【Module】蘭をHogeUIComponentsFugaUIComponentsに修正しないとビルドエラーになるようにできるのです!

これで【Module】蘭の誤りをチェックできます