Swiftファイルの自動生成されるヘッダーをテンプレートを共有しながら一部ユーザー毎に別の文言を入れたくなった!

# はじめに
タイトルがかなり長ったらしくなりましたが、記事にしたいことは割とタイトルのままです!
XcodeでSwiftファイルを作成するとき、以下のようなヘッダーが自動で付与されていることと思いますが、これをチーム内でカスタムしたテンプレートを共有しつつ、実装者名をカスタムしたい場合の対応方法を記事にしました。

```swift
//
//  <ファイル名>
//  <ターゲット名>
//
//  Created by <実装者のMacユーザー名> on <ファイル作成日>.
//
```

具体的には、上記テンプレートを以下のようにカスタマイズできるようにします。

```swift
//
//  <ターゲット名>
//  <ファイル名>
//
//  Created by <開発者毎に好きに設定した名前> on <ファイル作成日>.
//  Copyright © <組織名> All rights reserved.
//
```

# 意義
ヘッダーのテンプレートをカスタマイズすること自体は割と簡単にできますし、既にわかりやすい記事もたくさんあるのでそれだけではn番煎じの記事ですが、
実装者の名前の部分だけ開発者毎に定義した値を設定できるようにするという部分は、調べていてもなかなか出来こず少しく苦戦しましたので、記事にすることにそこそこの意義を感じています。

# 対応方法
## カスタムテンプレートの共有
先にも述べた通り、カスタムテンプレートを共有する方法は既に他の記事でも解説されているので、ひとまず筆者が見ていて一番わかりやすかったものを共有いたします。

https://ulog.sugiy.com/xcode-header-macro-setting/

上記を参考に、こちらでもカスタムテンプレートの共有方法を解説します。

カスタムテンプレートの設定は、`IDETemplateMacros.plist`というファイルを定義することで行うことができます。
今回の作りたいテンプレートから以下ファイルの内容でファイルを作成します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>FILEHEADER</key>
	<string>
//  ___TARGETNAME___
//
//  ___FILENAME___
//
//  Created by <任意の開発者名> on ___DATE___
//  Copyright © <任意の組織名> All rights reserved.
//</string>
</dict>
</plist>
```

上記設定ファイルの`string`タグでヘッダーのテンプレートを定義できます。
このファイルでは`___`で囲われたマクロを使用することができます。
例えば以下のようなマクロがあり、上記設定ファイルでも使用しています。

| マクロ名 | 内容 |
| ---- | ---- |
| `___TARGETNAME___` | ターゲット名 |
| `___FILENAME___` | ファイル名 |
| `___DATE___` | ファイルを作成した日時(yyyy/MM/dd) |

下記ドキュメントで使用できるマクロを確認することができます。

https://help.apple.com/xcode/mac/9.0/index.html?localePath=en.lproj#/dev7fe737ce0

`IDETemplateMacros.plist`の置き場所は用途によって変わってきます。

| | 種類 | 用途 | パス |
| ---- | ---- | --- | --- |
| 1 | Project User Data | xcodeprojファイルを使用していて、開発者専用に定義したい場合 |`<ProjectName>.xcodeproj/xcuserdata/<UserName>.xcuserdata/IDETemplateMacros.plist` |
| 2 | Project Shared Data | xcodeprojファイルを使用していて、チーム共通で定義したい場合 | `<ProjectName>.xcodeproj/xcshareddata/IDETemplateMacros.plist` |
| 3 | Workspace User Data | workspaceファイルを使用していて、開発者専用に定義したい場合 | `<WorkspaceName>.xcworkspace/xcuserdata/<UserName>.xcuserdata/IDETemplateMacros.plist` |
| 4 | Workspace Shared Data | workspaceファイルを使用していて、チーム共通で定義したい場合 |`<WorkspaceName>.xcworkspace/xcshareddata/IDETemplateMacros.plist` |
| 5 | Xcode User Data | 開発者の環境でプロジェクトを跨いで共通でカスタムテンプレートを適用したい場合 |`$HOME/Library/Developer/Xcode/UserData/IDETemplateMacros.plist` |

今回はチーム共通でカスタムテンプレートを定義したいので、上記の2 or 4に`IDETemplateMacros.plist`を配置すると良さそうです。
あとはworkspaceファイルを使用しているかどうかで、2 or 4を選択します。

筆者はworkspaceを使用していたので、4の下記パスに配置しました。
```
<WorkspaceName>.xcworkspace/xcshareddata/IDETemplateMacros.plist
```

説明するまでもないかもなのですが、チームでテンプレートを共有する際は、`IDETemplateMacros.plist`はリポジトリに共有するようにしましょう。

ここまでの内容を行うと、ファイル作成したら以下のようなヘッダーになっていると思います。


ターゲット名: SampleTarget
ファイル名: File.swift
ファイル作成日: 2024/11/27
```swift
//
//  SampleTarget
//  File.swift
//
//  Created by <任意の開発者名> on 2024/11/27.
//  Copyright © <任意の組織名> All rights reserved.
//
```

一部を除いてうまく設定できていそうです！

組織名は`IDETemplateMacros.plist`に直書きすれば良いですが、<任意の開発者名>は例えばgithubのユーザー名にしたいというふうにする場合、上記で説明したマクロにそのようなマクロがないのでまだやりたいことが100%できていません。

## 開発者名を開発者毎に任意の値で指定できるようにする
こちらは、`IDETemplateMacros.plist`でカスタムマクロを作成する機能を利用して、実現することができました。
カスタムマクロとはなんぞやという感じですが、百聞は一見にしかずですので、実際にカスタムマクロを作成した例を見てみましょう。

現在の`IDETemplateMacros.plist`に開発者名のカスタムマクロを追加しました。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>FILEHEADER</key>
	<string>
//  ___TARGETNAME___
//
//  ___FILENAME___
//
//  Created by ___DEVELOPERNAME___ on ___DATE___  // カスタムマクロを使用
//  Copyright © <任意の組織名> All rights reserved.
//</string>
  <key>DEVELOPERNAME</key> // DEVELOPERNAMEという名前でマクロを定義
  <string>stotic-dev</string>
</dict>
</plist>
```

`key`タグにマクロ名、`string`タグにマクロを使用した時に出力する値を定義します。
そうすることで、もともと定義されてあるマクロと同様に、`___`でマクロ名を囲うことで、使用することができます。

上記定義で実際にファイルを作成すると以下のようになると思います。

ターゲット名: SampleTarget
ファイル名: File.swift
ファイル作成日: 2024/11/27
```swift
//
//  SampleTarget
//  File.swift
//
//  Created by stotic-dev on 2024/11/27.
//  Copyright © <任意の組織名> All rights reserved.
//
```

ただ、上記ではまだ ___開発者毎に___ 開発者名を定義するという要件は達成できていません。
なぜなら、上記`IDETemplateMacros.plist`はリポジトリにて共有されているファイルなので、全ての実装者名が`stotic-dev`となってしまいます。

この問題を解決するために、上述した`IDETemplateMacros.plist`の配置場所によって用途が変わる仕様を利用します。
具体的には、1の`Project User Data` or 3の`Workspace User Data` or 5の`Xcode User Data`にて新たに`IDETemplateMacros.plist`を配置し、カスタムマクロのみを定義するようにします。

筆者の場合は、以下`IDETemplateMacros.plist`を`<WorkspaceName>.xcworkspace/xcuserdata/<UserName>.xcuserdata/IDETemplateMacros.plist`に配置しました。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <key>DEVELOPERNAME</key>
  <string>stotic-dev</string>
</dict>
</plist>
```
※こちらの``IDETemplateMacros.plist`は`.gitignore`に記載してリポジトリには公開しない

そして、リポジトリに公開している下記`IDETemplateMacros.plist`のカスタムマクロの記載は削除します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>FILEHEADER</key>
	<string>
//  ___TARGETNAME___
//
//  ___FILENAME___
//
//  Created by ___DEVELOPERNAME___ on ___DATE___.
//  Copyright © <任意の組織名> All rights reserved.
//</string>
</dict>
</plist>
```

そうすることで、再度ファイルを作成すると、当初の要件通りのヘッダーをテンプレート化できるようになりました。

# おわり
結構ニッチな話と思いますが、こういうこともできるんだなあと勉強になりました。
他の方のご参考になれば幸いです。