LoginSignup
6
4

More than 1 year has passed since last update.

XcodeのExcluded Source File Namesを使って不要なファイルを除外する

Posted at

XcodeのBuild SettingsExcluded 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が活用できます。

例えば、以下のようなフォルダ構成の場合、
スクリーンショット 2022-08-15 14.26.35.png
Excluded Source File NamesReleaseに対して、以下のように、$PROJECT_DIR/SwiftChartsExample/Stub/Data/*と指定すると、
スクリーンショット 2022-08-15 14.29.38.png
そのフォルダに含まれているファイル、今回で言うと、imageB.pngSampleB.jsonDebugDataB.swiftが、リリースビルドをおこなった場合に、除外されます。(JSONや画像ファイルはコピーされなくなり、Swiftファイルはコンパイルされなくなります。)

実際にDebugとReleaseでビルドを行い、ビルドログを確認してみます。

まずはBuild ConfigurationをDebugのままでビルドを実行します。
スクリーンショット 2022-08-15 14.36.02.png
スクリーンショット 2022-08-15 14.36.14.png
スクリーンショット 2022-08-15 14.36.26.png
上記スクリーンショットのように、ビルドログを確認すると、imageB.pngSampleB.jsonはコピーされ、DebugDataB.swiftはコンパイルされていることが分かります。

では次に、Build ConfigurationをReleaseに変更します。
スクリーンショット 2022-08-15 14.37.11.png

そして、同じようにビルドを実行します。
スクリーンショット 2022-08-15 14.38.22.png
スクリーンショット 2022-08-15 14.38.12.png
スクリーンショット 2022-08-15 14.37.51.png
同じようにビルドログを確認すると、上記スクリーンショットのように、imageB.pngSampleB.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でも可能です。
settingsconfigsに、EXCLUDED_SOURCE_FILE_NAMESを追加して、除外したい内容を定義することが出来ます。

    settings:
      configs:
        Debug:
          EXCLUDED_SOURCE_FILE_NAMES: SwiftChartsExample/Stub/** SwiftChartsExample/Stub/Data/**

除外設定のワイルドカードの挙動について

Excluded Source File Namesの設定は、 サブフォルダに対しては動作しないようです。
**を指定すれば良いと言う内容を見かけましたが、実際に手元で試したところ、うまく除外ができませんでした。

以下、StubStub/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/*を指定する感じになると思います。

ワイルドカードでサブフォルダも含めて指定できる方法をご存知の方は、是非、情報提供をお願い致します。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4