XcodeのBuild Settings
のExcluded Source File Names
を利用する事で、対象のビルドから指定したファイルを取り除くことが出来ます。
#if DEBUG
のようなマクロは、おそらく、いろんなプロジェクトで利用されていると思いますが、Excluded Source File Names
は意外と使われていない印象を受けたので、記事にしてみようと思いました。
最近関わったプロジェクトでも、Excluded Source File Names
ではなく、ファイルの先頭と末尾に、#if DEBUG
と#endif
を書いて運用していました。
こんな感じですね。
#if DEBUG
import SwiftUI
/// Data for the top style charts.
struct DebugTopStyleDataB {
/// Sales by pancake style for the last 30 days, sorted by amount.
static let last30Days = [
(name: "Demo001", sales: 200),
(name: "Demo002", sales: 300),
(name: "Demo003", sales: 500),
(name: "Demo004", sales: 700),
(name: "Demo005", sales: 100),
(name: "Demo006", sales: 400)
]
/// Sales by pancake style for the last 12 months, sorted by amount.
static let last12Months = [
(name: "Demo001", sales: 9000),
(name: "Demo002", sales: 7000),
(name: "Demo003", sales: 6000),
(name: "Demo004", sales: 5000),
(name: "Demo005", sales: 8000),
(name: "Demo006", sales: 4000)
]
}
#endif
これでも、もちろん、DEBUGの場合しか該当コードはビルドされないので、要件は満たせていると思います。
ただ、デバッグ用のJSONフィイルや画像ファイルについては、どうすればいいのでしょうか?
そんな場合にExcluded Source File Names
が活用できます。
例えば、以下のようなフォルダ構成の場合、
Excluded Source File Names
のRelease
に対して、以下のように、$PROJECT_DIR/SwiftChartsExample/Stub/Data/*
と指定すると、
そのフォルダに含まれているファイル、今回で言うと、imageB.png
、SampleB.json
、DebugDataB.swift
が、リリースビルドをおこなった場合に、除外されます。(JSONや画像ファイルはコピーされなくなり、Swiftファイルはコンパイルされなくなります。)
実際にDebugとReleaseでビルドを行い、ビルドログを確認してみます。
まずはBuild ConfigurationをDebugのままでビルドを実行します。
上記スクリーンショットのように、ビルドログを確認すると、imageB.png
、SampleB.json
はコピーされ、DebugDataB.swift
はコンパイルされていることが分かります。
では次に、Build ConfigurationをReleaseに変更します。
そして、同じようにビルドを実行します。
同じようにビルドログを確認すると、上記スクリーンショットのように、imageB.png
、SampleB.json
がコピーされたと言うログは見つからず、DebugDataB.swift
についても、コンパイルされたと言うログは見当たりません。
このように、Excluded Source File Names
を活用する事で、リソースファイルをコピーしないようにしたり、ファイル自体をコンパイルしないようにする事が可能となります。
この仕組みを利用すれば、ファイルの先頭と末尾に、#if DEBUG
と#endif
を書く、という作業は不要になるかもしれませんね。
補足
最後に、Excluded Source File Names
について少し補足しておきます。
指定方法
上記の説明では、除外対象のファイルパスを$PROJECT_DIR/SwiftChartsExample/Stub/Data/*
のように絶対パスで指定していましたが、手元で試したところ、SwiftChartsExample/Stub/Data/*
として相対パスでの指定も可能でした。
XcodeGen
Excluded Source File Names
の設定は、XcodeGenでも可能です。
settings
のconfigs
に、EXCLUDED_SOURCE_FILE_NAMES
を追加して、除外したい内容を定義することが出来ます。
settings:
configs:
Debug:
EXCLUDED_SOURCE_FILE_NAMES: SwiftChartsExample/Stub/** SwiftChartsExample/Stub/Data/**
除外設定のワイルドカードの挙動について
Excluded Source File Names
の設定は、 サブフォルダに対しては動作しないようです。
**
を指定すれば良いと言う内容を見かけましたが、実際に手元で試したところ、うまく除外ができませんでした。
以下、Stub
とStub/Data
フォルダに対して、実際に指定した内容とビルドの結果を記載しておきます。
設定内容 |
Stub フォルダ内のファイル |
Stub/Data フォルダのファイル |
---|---|---|
**/Stub* |
除外されなかった | 除外されなかった |
**/Stub/**/* |
除外されなかった | 除外されなかった |
SwiftChartsExample/Stub** |
除外されなかった | 除外されなかった |
SwiftChartsExample/Stub* |
除外されなかった | 除外されなかった |
SwiftChartsExample/Stub/** |
除外された | 除外されなかった |
SwiftChartsExample/Stub/* |
除外された | 除外されなかった |
SwiftChartsExample/Stub/**/* |
除外されなかった | 除外された |
SwiftChartsExample/Stub/**/** |
除外されなかった | 除外された |
SwiftChartsExample/Stub/*/** |
除外されなかった | 除外された |
SwiftChartsExample/Stub/* SwiftChartsExample/Stub/Data/* |
除外された | 除外された |
SwiftChartsExample/Stub/** SwiftChartsExample/Stub/Data/** |
除外された | 除外された |
以上の結果、サブフォルダがある場合は、サブフォルダの記述も行っておく方が良いと思います。
今回のサンプルでは、SwiftChartsExample/Stub/*
とSwiftChartsExample/Stub/Data/*
を指定する感じになると思います。
ワイルドカードでサブフォルダも含めて指定できる方法をご存知の方は、是非、情報提供をお願い致します。