[Xcode9対応] Project Template の作り方

# TL;DR

+ Xcodeでは，[自分でカスタマイズしたテンプレート](https://qiita.com/krimpedance/items/abf6c4da74e5729b427d)からプロジェクトを開始できる
+ フォルダ構成や初期ファイルを好きなようにいじれるので重宝してる
+ Xcode9から，プロジェクトテンプレートでフォルダ作れなくなった:innocent:
+ 基盤プロジェクトのコピー＆[リネーム](https://tech.librastudio.co.jp/index.php/2016/10/05/post-1038/)で対応するしかないか:thinking:
+ でも毎回やるのは面倒だし内部的にリネーム前の情報残ってる...
+ [スクリプト作ったよ](https://gist.github.com/krimpedance/c670b71a6244a758cde2f5dfbaf5cb73)．これでみんなハッピー:v:
    - `createProject.sh MyTemplate MyProject`
+ おまけでファイルテンプレートの作り方も載せてるよ

# Xcode8までのプロジェクトテンプレート

プロジェクトテンプレートとは，Xcodeで「Create a new Xcode project」を押した時に出てくる `Single View App` ， `Tabbed App` といった，アプリを作る為に必要なファイルや設定をテンプレートとして用意したものです．
最小の構成はAppleさんが一通り用意してくれてますが，自分で好きなように作成することもできます．
作り方は[こちら](https://qiita.com/krimpedance/items/abf6c4da74e5729b427d)にまとめてあります．

フォルダを作らず初期ファイル等だけ用意するのであれば， **上記の作り方で全然問題ありません**.
むしろ，こちらのほうが通常の作成方法と手順が同じなのでいいかもしれません．

# 突然の別れ

9月某日．
いつものように自作したテンプレートからプロジェクトを作成しようとしたところ.

<img width="271" alt="スクリーンショット 2017-12-18 22.22.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/93219/b30f190d-4868-22c4-6923-9d5a39630877.png">

#### :japanese_goblin:!!!!!!

原因はわかりませんが，[Xcodeの新機能](https://dev.classmethod.jp/smartphone/iphone/xcode-9-new-features/#toc-group)が関係していると思われます．
しばらく `template.plist` 周りを弄ってみましたが，どうやら無理なようでした．~~(諦めた)~~

# 物理テンプレートのコピペでいけるか？

物理テンプレートと言うと語弊があるかもしれませんが，基盤となるプロジェクトを作成しておいて，それをコピー，[リネーム](https://tech.librastudio.co.jp/index.php/2016/10/05/post-1038/)することで代変します．

ですがこの方法，

+ プロジェクト名，フォルダ名をそれぞれ変更しなければいけない
+ 初期ファイル(`MyProjectConfig.swift`, ...)も別途変更しなければいけない
+ 内部的にテンプレートのプロジェクト名が残ってる部分がある

といった面倒な点があります．

そんなときはもちろん *Shell Script* の登場です． :construction_worker_tone3:

# スクリプトによるコピー＆リネーム

#### :new_moon:　基盤となるプロジェクトの作成

私はMVCかMVVMでの開発がほとんどなので， `MyProjectTemplate_MVC`，`MyProjectTemplate_MVVM`というプロジェクト名でそれぞれ作成します．
`.swiftlint.yml`，`Podfile`などいつも使うファイルを配置，フォルダ構成の調整して，プロジェクトテンプレートを構築します．(これらのファイルのプロジェクト名が入る部分はテンプレートのプロジェクト名と同じにしておきます．)

作成したプロジェクトはどこか一箇所にまとめておきます．
今回は`~/Documents/xcode/Template/`以下に置いて話を進めます．

#### :new_moon: スクリプトの作成

さっそく作っていきましょう．(さらっと流します)

##### ・ スクリプトのイメージを決定

ベースは以下のようにします．

```bash
$ ./script.sh MyTemplate path/to/MyProject
```

今回の私の場合は， MVCとMVVMのテンプレートを作成したので， Aliasを登録して

```bash
$ new_mvc_project path/to/MyProject
$ new_mvvm_project path/to/MyProject
```

こんな感じで運用したいと思います．

##### ・ プロジェクトのコピー

```bash:script.sh
cp -R ~/Documents/xcode/Template/$templateName $projectPath
```

##### ・ フォルダ，ファイルのリネーム

```bash:script.sh
paths=`find -d $projectPath -name "*$templateName*"`
for path in $paths
do
  replacePath=`dirname $path`/`basename $path | sed "s/$templateName/$projectName/g"`
  mv $path $replacePath
done
```

`find`コマンドで，テンプレート名の入っているフォルダ，ファイルのパスを取得しています．
`-d`オプションで，ディレクトリ内のファイルを階層の深いディレクトリから先に検索します．（そうしないとリネーム時にパスがおかしくなります．)
各フォルダ(ファイル）名のテンプレート名部分をリプレイスしてます．

##### ・ ファイル内のリネーム

```bash:script.sh
files=`find $projectPath -type f -print`
for file in $files
do
  sed -i '' -e "s/$templateName/$projectName/g" $file
done
```

今度は`find`コマンドで全ファイルを取得して，`sed`コマンドでテンプレート部分を置き換えています．

##### ・ alias登録

```bash:.bashrc
alias new_mvc_project="path/to/script.sh MyProjectTemplate_MVC"
alias new_mvvm_project="path/to/script.sh MyProjectTemplate_MVVM"
```

#### :new_moon: プロジェクトを作ってみる

```bash
$ new_mvc_project MyProject
```

<img width="270" alt="スクリーンショット 2017-12-19 10.21.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/93219/07ec2d58-3bb5-d492-2d62-7c5c395f2382.png">

はい，いい感じに完成しました．
完成したスクリプトは[こちら](https://gist.github.com/krimpedance/c670b71a6244a758cde2f5dfbaf5cb73)に置いてます

# おまけ

Xcodeでは，プロジェクトだけでなくファイルのテンプレートも作成できます．

```bash
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates
```

上記の場所には，標準のテンプレートが準備されています．
これらを `~/Library/Developer/Xcode/Templates/File Templates`にコピーして弄ることで，自分専用のファイルテンプレートを作成できます．
詳しいやり方等は[こちら](https://qiita.com/shu223/items/5d8a245e5743f77df9eb)が参考になります．

# まとめ

今回はXcode9になって既存のプロジェクトテンプレートが使えなくなった場合の対処法を共有させていただきました．
いままで標準のテンプレートしか使っていなかった方も，使いやすいテンプレートを作成するきっかけになればと思います．

Xcodeがどのようにしてプロジェクトの雛形を作成しているか気になる方は

```bash
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates
```

などを覗いてみてください．

それではよいXcodeライフを．