Xcode
iOS
Swift

[Xcode9対応] Project Template の作り方

TL;DR

  • Xcodeでは,自分でカスタマイズしたテンプレートからプロジェクトを開始できる
  • フォルダ構成や初期ファイルを好きなようにいじれるので重宝してる
  • Xcode9から,プロジェクトテンプレートでフォルダ作れなくなった:innocent:
  • 基盤プロジェクトのコピー&リネームで対応するしかないか:thinking:
  • でも毎回やるのは面倒だし内部的にリネーム前の情報残ってる...
  • スクリプト作ったよ.これでみんなハッピー:v:
    • createProject.sh MyTemplate MyProject
  • おまけでファイルテンプレートの作り方も載せてるよ

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

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

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

突然の別れ

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

スクリーンショット 2017-12-18 22.22.16.png

:japanese_goblin:!!!!!!

原因はわかりませんが,Xcodeの新機能が関係していると思われます.
しばらく template.plist 周りを弄ってみましたが,どうやら無理なようでした.(諦めた)

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

物理テンプレートと言うと語弊があるかもしれませんが,基盤となるプロジェクトを作成しておいて,それをコピー,リネームすることで代変します.

ですがこの方法,

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

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

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

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

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

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

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

:new_moon: スクリプトの作成

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

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

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

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

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

$ new_mvc_project path/to/MyProject
$ new_mvvm_project path/to/MyProject

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

・ プロジェクトのコピー
script.sh
cp -R ~/Documents/xcode/Template/$templateName $projectPath
・ フォルダ,ファイルのリネーム
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オプションで,ディレクトリ内のファイルを階層の深いディレクトリから先に検索します.(そうしないとリネーム時にパスがおかしくなります.)
各フォルダ(ファイル)名のテンプレート名部分をリプレイスしてます.

・ ファイル内のリネーム
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登録
.bashrc
alias new_mvc_project="path/to/script.sh MyProjectTemplate_MVC"
alias new_mvvm_project="path/to/script.sh MyProjectTemplate_MVVM"

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

$ new_mvc_project MyProject

スクリーンショット 2017-12-19 10.21.58.png

はい,いい感じに完成しました.
完成したスクリプトはこちらに置いてます

おまけ

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

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

上記の場所には,標準のテンプレートが準備されています.
これらを ~/Library/Developer/Xcode/Templates/File Templatesにコピーして弄ることで,自分専用のファイルテンプレートを作成できます.
詳しいやり方等はこちらが参考になります.

まとめ

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

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

/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ライフを.