Sourceryの使い方を調べた

Sourceryの使い方を調べたので記録を残しておく

Sourceryとは

Sourcery は Swift のボイラープレートを自動生成するためのツール try! Swift Tokyo 2018における作者のトーク によると Sourcery は 5000 以上の実プロジェクトで使われていて、 Apple 社員のなかにもユーザがいるとのこと。

モチベーション

Swift は厳格な静的型付言語であるがゆえ、大量のボイラープレートが必要になる。例えばオブジェクト同士を比較するためのEquatableも開発者が実装する必要がある。1つのクラスであれば大した作業ではないが、クラス数が増えることで大変な手間となり、バグが混入する原因にもなる。それらを自動化するためのツールが Sourcery である。

利点として導入にリスクがなく、不要になったらテンプレートを削除すればOKであること、タイプセーフであることが挙げられる。

導入方法

Sourcery のリポジトリにあるサンプルプロジェクト を参考にするとよい。

1. ディレクトリ作成

以下のディレクトリをあらかじめ作成しておく

2. Cocoapods

iOSアプリで使用する場合、 Cocoapodsを使ってインストールが可能。

Podfileの内容は以下のとおり

target 'YoutTargetName' do
  use_frameworks!
  pod 'Sourcery'

end

3. Run Script の設定

TARGETS -> プロジェクト名 -> Build Phrases -> New Run Script Phrase を追加して、ビルドの度に以下のスクリプトを実行するように設定する

各引数に

を指定する

"${PODS_ROOT}/Sourcery/bin/sourcery" --sources "${SRCROOT}/YourProjectName" --templates "${SRCROOT}/Templates" --output "${SRCROOT}/CodeGenerated"

もちろんBuild Phrasesにこのスクリプトを追加せず、手動で実行する運用でも問題ない。

4. プロトコルの実装

AutoEquatable, AutoHashableなど自動生成するプロトコルを予めどこかに実装する。これをやっておかないとツールがエラーになり、生成に失敗する。

protocol AutoEquatable {}

5. ビルド

1 ~ 4 までの手順が完了すれば、ビルドする度にSourceryによるコード生成が行われる。

Templatesの書き方

テンプレートは Stencil という Django template, Mustache に似た記法を使って書く。

リポジトリ にサンプルがあるのでこの辺りから出発するのが良さそう。