XCodeGenを導入してみた

XcodeGen

Xcodeでチーム開発をすると、*.xcodeprojでコンフリクトが度々起こりコンフリクトを修正する機会が多くあります。

iOS開発者なら、誰しもが歩ん道だと思います。

*.xcodeprojは、ソースファイルの管理を行なっておりファイルの追加や削除をするとこのファイルが更新されます。

大規模になればなるほど、このファイルはコンフリクトする可能性が高まります。

また、大規模開発ではマルチモジュール化により大規模な改修が見込まれます。

その際、ファイル移動は必須であり*.xcodeprojがコンフリクトする可能性は高いです。

ベンチャー企業でも下記のような問題は起こってくると考えています。

  • プログラミングに慣れていない人がいるため、コンフリクトを比較的起こしたくない
  • プロジェクトが始まってまもないためファイル生成する機会が多い

ですので、XcodeGenの仕組みについて理解しておく必要があると思っています。

導入

XcodeGenは、Swiftで記述されたコマンドラインツールでXcodeのプロジェクトデータをYamlで定義する事で*.xcodeprojを生成してくれます。

プロジェクトの仕様は、ターゲット、構成、スキーム、カスタムビルド設定、その他カスタマイズしていく事で生成が可能です。

https://github.com/yonaskolb/XcodeGen

では、実際に作ったYamlファイルを見ていきます。

name: proj-name
options:
  bundleIdPrefix: com.proj-name
targets:
  proj-name:
    type: application
    platform: iOS
    deploymentTarget: "11.0"
    sources: [proj-name]
    settings:
        MARKETING_VERSION: 1.0.0
    schemes:
      proj-name:
        testTargetName: proj-nameTests
    dependencies:
      - carthage: RxCocoa
      - carthage: RxRelay
      - carthage: RxSwift
      - carthage: Action
      - carthage: RxOptional
      - carthage: Swinject
      - carthage: DifferenceKit
      - carthage: KeychainAccess
      - carthage: SVProgressHUD
    preBuildScripts:
           - path: /bin/sh
             name: Run R.swift
             inputFiles:
               - $TEMP_DIR/rswift-lastrun
             outputFiles:
               - $SRCROOT/$PROJECT_NAME/R.generated.swift
             script: |
                     "Pods/R.swift/rswift" generate "$SRCROOT/testProject/R.generated.swift"

  proj-nameTests:
    type: bundle.unit-test
    platform: iOS
    deploymentTarget: "11.0"
    sources: [proj-nameTests]
    dependencies:
      - target: proj-name
      - carthage: RxBlocking
      - carthage: RxTest

実装は、このようになりました。

ほとんど、ReadMeに書いてあるままで生成出来ました。

settings: MARKETING_VERSION: 1.0.0

こちら、Build Settingでエラーが起こったためこの設定を入れました。

R.swiftをよく使うのですが、BuildScriptsで、普段の導入時に指定している内容を書くだけでR .swiftの導入も可能でした。

今後、Xcodeの設定も日々複雑になると思うので悪戦苦闘しながらこの辺り学んでいきたいと思います。

今後したいこと

XcodeGenをMintで、管理したいと思っています。 他には、Xcode Genのようなコマンドラインを作ってみるのも面白そうだと書きながら感じました。

記事としては、Makefileも同時に作成したのでそれを書いていきます。