#1.はじめに
仕事でBuild Target、Schemeの追加をする時、毎回忘れてググって調べるという悪循環を繰り返します。このスパイラルから抜け出る為に自分用の簡易的なHowToを備忘録兼ねて残します。
他にも類似記事はありますが、参考になればと思います。
各設定の詳細については、知識不足であったり、補足が足らないところもあればコメントお願いいたします。
#2.環境
Xcode10.1
#3.Build Target、Build Scheme、 BuildConfigurationとは?
まず、いつもこの辺りがうやむやになってしまっているので一度整理します。
・Build Targetとは?
新規プロジェクトを追加した際は自動で1つ作られています。1つのビルド情報についてのかたまりのようなもの。
こいつを複数、例えばdebug、release,staging用と作れば、BuildSettingやInfo.plist、Capabilitesの中身を環境ごとに設定を変えられたりする。
・Build Schemeとは?
スキームは、どのターゲットをビルドするか指定した設定のコレクションのこと。どのビルド構成を使用するか、およびターゲットで指定されたプロダクトが起動されるときに使用するための実行環境のことです。
Build Configurationとは?
BuildSettingなどでパスや処理を分岐させたい場合に設定する値。
新規プロジェクトではdebug、releaseの2つが既にある。
まとめると
・Build Target
環境ごとのビルド情報をまとめたもの
・Build Scheme
Build Targetに指定したものをビルドする実行環境
・Build Configuration
BuildSettingなどでパスや処理を分岐させたい場合に設定する値。
例)
Developer):「Debugでビルドしよう。スキームをHogeProjectDebugに変えてと、ビルドポチッ!」
Xcode):「はい、ビルドするかー。えっとまずスキームどれだ?」
「...HogeProjectDebugか、次にビルド実行するのにまずスキームに紐づいているターゲットの設定みてと。」
「あとは、スキームのbuild configurationはなんだっけ?、debugが指定されているか」
「じゃあソースコードにあるマクロはdebug用ので実行っと。よしビルド!|」
みたいな感じ。
ちなみにターゲット1つでDebug、Release、Stagingに分けたいという場合は、ターゲットは追加しないで、スキームとbuildConfiguration、Active Compilation Conditionsの設定だけです。
今回はスキームごとにターゲットを追加していますが、基本的にスキーム分の数ターゲットを追加することはしない方が良いです。またターゲットを追加するとinfo.plistもその分生成されます。
(増えたplistの設定やファイル名が初回に追加したターゲット名のままになっている件は、触れません笑)
その分、設定が増え、バグの温床になりかねません。
ターゲットを増やしてBuildSettingやinfo.plistの設定を変更する必要がある場合にのみ行うのが良いと思います。
#3.手順
では、まず流れとして下記の手順で行います。
- ビルドターゲットの追加
- ビルドスキームの追加
- Build Configurationの追加
- Active Compilation Conditionsの追加
- マクロの記述
- 実行結果確認
##3-1. ビルドターゲットの追加
画像の矢印のところがProjectSetting>taget一覧です。ない場合は、隠れているので矢印をクリックで表示させましょう。ProjectSettingのどのタブにいてもBuildTargetのリストは表示できます。
次に、既存の1つのターゲットを右クリック>deplicate
を選択すると新たにコピーが作成されます。
上の画像はコピーしたあとの画像なのでリストの下にSchemeTest copy
が作成されているのがわかります。
作成できたら名前をSchemeTest-Stagingにしておきます。
同様にRelease環境も作っておきたいので、同じようにしてコピーしたターゲットの名前をSchemeTest-Releaseにします。
下記の画像のようになります。
##3-2. ビルドスキームの追加
次にスキームの追加ですが、過去のXcodeがどうだったか忘れましたが、Xcode10の場合は、ターゲットを追加すると自動で同じ名前のスキームが自動追加されます。
実際にスキームを見てみましょう。
XcodeのトップバーのRun実行停止ボタンの右にターゲット選択ボタンがあるのでクリックするとターゲットの一覧が表示されます。
先ほど名前を変更しましたが、スキームの方は変更されていませんね。
それでは、Manage Schemes...
を選択してスキーム管理画面を表示させましょう。
copy、copy2の2つをそれぞれターゲットと同じ、SchemeTest-Staging、SchemeTest-Releaseにリネームします。
ちなみに先ほど、ターゲットを追加でスキームが追加されたのはこの画面の右上にあるAutoCreate Schemeが有効になっていたからです。便利ですね。
あとはBuild Configurationを追加してみましょう。
##3-3. Build Configurationの追加
下記画像の赤文字の手順で、Project>Project Target>+ボタンをクリック。
するとDeplicate Debug Configuration、Deplicate Release Configurationとダイアログが表示されるので、Debugを選択。
Debug copyとしてBuildConfigurationが追加されました。
ここではStaging環境として追加したいので、名前をStagingに変えておきます。
同じようにReleaseも追加しましょう。
次にBuildSettingにあるActive Compilation Conditionsを設定します。
##3-4. Active Compilation Conditionsの設定
これはXcode8からの機能で、Xcode 7まではPreprocessor MacrosとOther Swift Flagsを設定することでマクロの記述を可能にしていましたが、それが簡単になりました。
それぞれ
DebugにはDEBUG
ReleaseにはPRODUCTION
StagingにはDEBUG STAGING
を設定しておきます。
最後にスキームの設定に戻って上記で設定したBuildConfigurationをスキームに設定します。
ちなみにSchemeの設定画面へはXcodeのスキーム選択ボタン以外にもXcodeのステータスバーのProduct>Scheme>Manage Schemes...からも開けます。
Manage Schemes画面を開いたら、SchemeTest-Stagingを選択し、Editボタンをクリック。
(SchemeTestターゲットはもともとdebugが設定済みなのでそのままで大丈夫です。)
表示すると左のタブでRunのinfoがデフォルト表示されています。
その中にBuild ConfigurationにDebugが選択されているのでこれをStagingに変更します。
左タブのその他、Test、Profile、Analyze、Archiveも変えておいた方がいいですが、今回は割愛します。
次に同じようにReleaseスキームにもReleaseのBuildConfigurationを適用させたいので、左上のスキームをSchemeTeset-Releaseに変更させ、同様に変更してCloseします。
あとは、試しにViewControllerでマクロの分岐処理とログを仕込んで実行してみます。
##3-5. マクロの記述。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
#if PRODUCTION
print("PRODUCTION Runing")
#endif
#if DEBUG
print("DEBUG Runing")
#endif
#if STAGING
print("STAGING Runing")
#endif
}
スキームを変えると自動でマクロの条件がtrueの記述のみが活性化するようになっているのでビルドしなくともわかるので便利です。
##3-6. 実行結果
・SchemeTest
DEBUG Runing
・SchemeTest-Staging
DEBUG Runing
STAGING Runing
今回はSTAGINGはDEBUGも含めたので、DEBUG、STAGING両方に入ります。
・SchemeTest-Release
PRODUCTION Runing
#4. 最後に
これを機にもうググらないでスキーム追加できるようにしたいものです。
今回のサンプルはgithubにあります。
https://github.com/kazy-dev/Scheme_Test
ご静聴ありがとうございました。