📋

Xcodeのファイルテンプレート機能をチームで使う 後編

2024/12/21に公開

はじめに

これは株式会社TimeTree Advent Calendar 2024の21日目の記事です。
https://qiita.com/advent-calendar/2024/timetree

昨日は @susiyakiスクラムフェス沖縄レポート でした!
プロダクト価値を向上させるためのなチームビルディング…奥が深いですね…🔎
私も持ち帰ってくれた知識を一緒に消化して社内チームを進化させていきたいです🔥
https://zenn.dev/timetree/articles/c4e39c14cfc565


こんにちは。TimeTreeのiOSエンジニアの @pengtaros です。正直度90%、ユーモア度75%で日々仕事をしています。

この記事では

  • さまざまなオプションを持つXcodeのカスタムファイルテンプレートを自作する方法
  • チームでカスタムファイルテンプレートを共有する方法

を紹介します!

Xcodeのカスタムファイルテンプレートにはじめて触る方は前編に目を通していただくことをお勧めします👀

対象読者

この記事は以下の読者を主な対象としています

  • Xcodeを使ってコードを書いている
  • 同一プロジェクト内で同じようなコードを書く場面が多く煩わしさを感じている
  • (オプション)チームの開発生産性を上げたいと考えている
  • (オプション)TimeTreeのiOSチームの開発実態を覗きたい

達成できること

記事を読んで以下のことが達成できるような内容になっています

  • 前編
    • Xcodeにカスタムファイルテンプレートを追加できる
  • 後編(この記事)
    • Xcodeのカスタムファイルテンプレートにオプションを追加できる
    • カスタムファイルテンプレートをチーム内で共有できる

柔軟なカスタムファイルテンプレートを共有してチームの生産性を向上させましょう!

Xcodeのカスタムファイルテンプレート作成時にオプションを追加する

ファイルテンプレートで Cocoa Touch Classを選択するとファイル名だけでなく、さまざまのオプションを追加で入力することができます。
Cocoa Touch Class
オプション
Cocoa Touch Classを選択すると、セレクトボックスやチェックボックスを使って生成するファイルを変更できる

カスタムファイルファイルテンプレートもこれらのオプションを以下の方法で追加することができます。

  1. 前編を参考に Swift File.xctemplate/Users/{ユーザー名}/Library/Developer/Xcode/Templates/My\ Templates にコピーする
  2. 1でコピーした.xctemplateディレクトリ内の TemplateInfo.plist を開く
  3. TemplateInfo.plistを編集して、Optionsを追加する

TemplateInfo.plist
TemplateInfo.plist
Options
Options

Options に追加できる項目の一部を設定方法と一緒に紹介します。

テキスト

テキストフィールドに入力した文字列を生成するファイルに埋め込むことができます
text input
Optionsの設定
Optionsの設定

Optionsの設定

  • Options(Array)
    • Item1
      • Identifier(String): オプションの識別子(一意になるよう入力)
      • Required(Bool): この項目が必須か
      • Name(String): 入力フィールド横のラベルとして表示される
      • Description(String): この項目の説明を入れる
      • Type(String): この値を text にすることで文字列を入力できる
      • NotPersisted(Bool): 一つ前に入力した値を記憶するか

Optionsで設定したIdentifeirの値を ___VARIABLE_identifier___ のキーワードを使ってテンプレート内の変数に使うことができます

fd.xctemplate内の___FILEBASENAME___.swift
import Foundation

// ___VARIABLE_note___

チェックボックス

チェックボックスの状態によって生成するファイルを変更することができます
checkbox
Optionsの設定
Optionsの設定

Optionsの設定

  • Options(Array)
    • Item1
      • Identifier(String): オプションの識別子(一意になるよう入力)
      • Required(Bool): この項目が必須か
      • Name(String): 入力フィールド横のラベルとして表示される
      • Description(String): この項目の説明を入れる
      • Type(String): この値を checkbox にすることでチェックボックスを入力できる
      • NotPersisted(Bool): 一つ前に入力した値を記憶するか

Options設定後に
.xctemplateディレクトリに Default と Optionsで設定した Identifier の値(写真の例だとchecked) の2種類のディレクトリを用意することで、チェックボックスにチェックが入っている時と入っていないときに生成するファイルを分けることができます

セレクトボックス

選択肢によって生成するファイルを変更することができます
セレクトボックス
Optionsの設定
Optionsの設定

  • Options(Array)
    • Item1
      • Identifier(String): オプションの識別子(一意になるよう入力)
      • Required(Bool): この項目が必須か
      • Name(String): 入力フィールド横のラベルとして表示される
      • Description(String): この項目の説明を入れる
      • Type(String): この値を popup にすることでセレクトボックスで入力できる
      • Default(String): デフォルトの値。Valuesの値のどれかにすること。
      • Values(Array): 選択肢(Stringの配列)

Options設定後に
.xctemplateディレクトリにOptionsで設定した Values の値(写真の例だとa, b, c) のディレクトリを用意することで、選択に合わせて生成するファイルを分けることができます

ファイル名

ファイル名を他のオプションと一緒に入力することができます
ファイル名
Optionsの設定
Optionsの設定

  • Options(Array)
    • Item1
      • Identifier(String): productName を入力
      • Required(Bool): この項目が必須か
      • Name(String): 入力フィールド横のラベルとして表示される
      • Description(String): この項目の説明を入れる
      • Type(String): text を入力
      • NotPersisted(Bool): 一つ前に入力した値を記憶するか

そのほか

今までに紹介したもの以外にもまだまだOptions設定はあります。
既存のテンプレートのTemplateInfo.plistと.xctemplateディレクトリの構成を参考にお試しください。
(冒頭で紹介したCocoa Touch Classを眺めるのお勧めです✨)

カスタムファイルテンプレートをチームで共有する

TimeTreeでは作成したカスタムファイルテンプレートをチームで共有するために以下の方法を採用しています

  1. カスタムファイルテンプレートをGitHubで管理する
  2. /Users/{ユーザー名}/Library/Developer/Xcode/Templatesにカスタムファイルテンプレートを同期するスクリプトを実行する

1. カスタムファイルテンプレートをGitHubで管理する
作成したカスタムファイルテンプレートを置き場所をアプリのリポジトリ内に作成しコミットしています。もし、カスタムテンプレートの追加・修正・削除する場合は、コードの変更同様PRを使って議論し変更をマージしています。

2. /Users/{ユーザー名}/Library/Developer/Xcode/Templatesにカスタムファイルテンプレートを同期するスクリプトを実行する
以下のようなスクリプトを実行してカスタムファイルテンプレートをローカルの保存場所に同期しています。

sync-xcode-templates
#!/bin/sh

# コピー元とコピー先を変数に設定
SOURCE_DIR="./Scripts/xcode_code_templates"
DEST_DIR="${HOME}/Library/Developer/Xcode/Templates/TimeTree"

# コピー元が存在するか確認
if [ ! -d "$SOURCE_DIR" ]; then
    echo "error: not found $SOURCE_DIR"
    exit 1
fi

# コピー先が存在しない場合は作成
mkdir -p "$DEST_DIR"

# テンプレートが保存されているディレクトリを同期
rsync -a --delete "$SOURCE_DIR"/ "$DEST_DIR"/

# コピーが成功したか確認
if [ $? -eq 0 ]; then
    echo "SUCCESS: finished syncing xcode templates"
else
    echo "error: failed to sync"
    exit 1
fi

まとめ

前編では「Xcodeのカスタムファイルテンプレートの仕組み」を紹介し、後編では「オプションを追加して自作の幅を広げる方法」と「作成したものをチームでの共有する方法」をご紹介しました。
この記事を読んでくれた方と所属する開発チームの生産性に少しでも貢献できたら幸いです✨

参考

https://note.com/taatn0te/n/nb44ed6ebf6bf
https://insights.overapp.com/create-xcode-templates-c968d4b43f7b

TimeTreeの採用情報

TimeTreeでは "「誘おう」をつくる" というミッションに向かって一緒に挑戦してくれる仲間を探しています。TimeTreeで働くことに興味がある方はぜひ一度お話ししましょう✨

TimeTreeのiOS開発チームの雰囲気がわかる募集要項はこちら🍎
https://open.talentio.com/r/1/c/timetree/pages/16544

いきなり面接は…という方はコーヒーでも飲みながら気軽にお話ししましょう☕️
https://open.talentio.com/r/1/c/timetree/pages/29064

会社概要やiOSアプリエンジニア以外の募集要項はフッターにございます📝
こちらもお待ちしております🙌

TimeTree Tech Blog

Discussion