今日初めてEmbedded Frameworkを使おうとしたのですが、XcodeGenと組み合わせた時どうするんだっけ?となったのでメモとして残しておきます。
Embedded Frameworkとは
直訳すると「埋め込みフレームワーク」となるEmbedded Frameworkは、アプリのコードの一部をFrameworkとして扱うことができます。
この機能を使う利点は複数あり、
- 必要なFrameworkだけビルドを行うのでビルドの高速化が期待できる
- AppExtensionとコードを共有できる
- 名前空間が分かれるため、テストを意識したコードがかける(はず)
と、アプリ開発する上で最初に導入しておくと後々効いてきそうだと思いました。
XcodeGenと組み合わせる
Embedded FrameworkはXcodeのTargetから追加できますが、前述の通りXcodeGenでプロジェクトデータを管理しているため、FrameworkもXcodeGenで管理の対象とする必要があります。
なので、project.yml
をこんな感じにしました。
name: TestApp options: bundleIdPrefix: com.example targetTemplates: EmbeddedFramework: platform: iOS type: framework sources: - path: ${target_name} EmbeddedFrameworkTests: type: bundle.unit-test platform: iOS dependencies: - target: TestApp sources: - path: ${target_name} targets: TestApp: type: application platform: iOS sources: - path: TestApp dependencies: - target: TestAppData - target: TestAppDomain - target: TestAppExtension TestAppTests: templates: - EmbeddedFrameworkTests TestAppData: templates: - EmbeddedFramework TestAppDataTests: templates: - EmbeddedFrameworkTests TestAppDomain: templates: - EmbeddedFramework TestAppDomainTests: templates: - EmbeddedFrameworkTests TestAppExtension: templates: - EmbeddedFramework TestAppExtensionTests: templates: - EmbeddedFrameworkTests ...
ここではFrameworkをData, Domain, Extension…と分けており、それぞれ同じBuild Settings
を使いたいので、targetTemplates
を使って共通で使えるようにしています。