dip Engineer Blog

Engineer Blog
ディップ株式会社のエンジニアによる技術ブログです。
弊社はバイトル・はたらこねっとなど様々なサービスを運営しています。

XCodeGen対応のTIPS

はじめに

こんにちは。iOSエンジニアの@satoshi-babaです。 いま巷で賑わっているXCodeGenを検証する過程で、ハマりどころがいっぱいあったので簡単なTIPSを共有したいと思います。 そもそもXCodeGenがどんなものかというのは割愛させていただきます。

バイトルはなぜXCodeGen対応したの?

バイトルiOSは10名前後のエンジニアが開発に携わっています。 ABテストの実施もよく行っており、ファイルの追加/削除が頻繁に行われるようになっています。

元々、開発フローの課題の1つにxcodeprojのコンフリクト抑止がありました。 その中で年末に行われていたtry! Swift Tokyo 2020 Meetup!!に参加した時に、XCodeGenの紹介があり「これだ!」と思い導入することにしました。

TIPS

Templateバリ便利!

SchemeとTargetにそれぞれTemplateを用意することができます。

例えばTargetであればこんな感じにテンプレートを用意することで記載をかなり簡略がすることができます。 例えば複数の環境設定がされている場合に使えます。

targetTemplates:
  application-base:
    type: application
    platform: iOS
    sources:
      - path: xxxxx
    info:
      properties:
        UISupportedInterfaceOrientations: [UIInterfaceOrientationPortrait]
        UILaunchStoryboardName: LaunchScreen
    settings:
      base:
        TARGETED_DEVICE_FAMILY: 1
        CODE_SIGN_STYLE: Manual
        ENABLE_BITCODE: No
        GCC_C_LANGUAGE_STANDARD: gnu99
        CLANG_CXX_LANGUAGE_STANDARD: gnu++0x
        CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED: Yes
    dependencies:
      - sdk: SystemConfiguration.framework
      - sdk: libsqlite3.tbd
    preBuildScripts:
      - name: R.Swift
        script: |
          echo 'make R.generated.swift'
          if [ -e "$SRCROOT/xxxxx/xxxxx/R.generated.swift" ]; then
          echo 'remove R.generated.swift'
          rm "$SRCROOT/xxxxx/xxxxx/R.generated.swift"
          fi
          "$PODS_ROOT/R.swift/rswift" generate "$SRCROOT/xxxxx/xxxxx/R.generated.swift"
        inputFiles:
          - $TEMP_DIR/rswift-lastrun
        outputFiles:
          - $SRCROOT/xxxxx/xxxxx/R.generated.swift
targets:
  # 個別の微小な設定を書くだけだから楽できる。
  stage1:
    templates:
      - application-base
    info:
      path: $(SRCROOT)/xxxxx/xxxxx/stage1/Info.plist
  stage2:
    templates:
      - application-base
    info:
      path: $(SRCROOT)/xxxxx/xxxxx/stage2/Info.plist

R.generated.swiftが解決できない時の対処

Gitからcloneした直後にxcodegenしてビルドすると以下のエラーが発生します。

``

R.swiftを導入したことがある方なら気づいていると思いますが、Run ScriptでR.generated.swiftを作成した後に手動で追加する手順があります。 そうするとxcodegenでプロジェクトファイルを生成する時には、上記のファイルはないわけなので参照に含まれなくなります。

そんな時はsourcesの設定でファイルがないときでも参照を追加するようにしましょう!

sources:
  - path: xxxxx
  - path: xxxxx/xxxxx/R.generated.swift
    optional: true
    createIntermediateGroups: true

Build Settingsのキー名の探し方

Build Settingsで細かい設定がされている場合、XCodeGenのsettingsで設定する必要があります。 バイトルの場合はC++ Language Dialectが該当していて設定する必要がありました。

こんな感じに設定します。

settings:
  base:
    CLANG_CXX_LANGUAGE_STANDARD: gnu++0x

この設定のキー名はCode Sign Styleなんかはなんとなく勘で行けることもありますが、 物によっては全くわからない場合があります。

そんな時はXCodeのプロジェクト設定から探すことができます。(Appleにドキュメントがあると思いますが探してません) 画像のQuick HelpのDeclarationを参照すれば一発ですね!これで大概のことはできそうです!

Build Settingsの設定値の探し方

Build Settingsのキーはわかっても具体的な設定がわからないことがあります。 例えばバイトルでハマったのは、C++ Language Dialectの設定値がわかりませんでした。

設定値は具体的な何を設定する項目なのかがわかれば、各種ドキュメントから漁ることで解決できます。 C++ Language DialectはClangの設定項目なので、 このページを参照することで解決することができました。

まとめ

XCodeGenのハマりどころは多いですがキチンと対処がわかっていれば怖くありません。 バイトルも取り入れられるところはどんどんモダンな技術を取り入れていきたいと思います。

著者

dippeople.dip-net.jp