簡體   English   中英

Xcode:從父項目繼承`configuration`s - 不可能嗎?

[英]Xcode: Inherit `configuration`s from parent project - not possible?

TL; 博士

是否可以從父項目繼承自定義配置? 不,不是要求繼承某些目標設置。

配置和預處理器宏/標志

Xcode 中的每個項目都使用稱為DebugRelease的兩個標准配置進行初始化。 使用目標構建設置中顯示名稱Preprocessor Macros下的設置(在.pbxproj這稱為GCC_PREPROCESSOR_DEFINITIONS )設置DEBUG標志是一種非常常見的模式,可以從這樣的 Objective-C 代碼中讀取。

#ifdef DEBUG
   print("DEBUG flag set")
#else 
   print("No debug flag!")
#endif

這也適用於 Swift,但是我們必須使用OTHER_SWIFT_FLAGS並像這樣聲明它:
-D DEBUG
並像我們在上面的 Objective C 代碼中一樣讀取變量值。

許多項目 => xcconfig 文件

我的應用程序由一個 xcworkspace 和一個主項目和幾個作為依賴項的項目組成。 讓我們稱我的應用程序依賴於框架的項目。 由於我有幾個框架,我不想多次設置構建設置。

因此我使用xcconfig文件。 我有一個主配置,即主項目的配置文件,我們稱之為Main.xcconfig 我有另一個名為Framework.xcconfig配置文件,它以#include "Main.xcconfig"#include "Main.xcconfig" ,因此繼承了Main設置。 當然,我設置了每個框架以使用上述Framework.xcconfig文件。

當我們有這些配置文件時,聲明DEBUG標志非常方便,我們在Main.xcconfig添加:

OTHER_SWIFT_FLAGS[config=Debug] = -D DEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = DEBUG

從而為主項目和框架項目的配置Debug聲明DEBUG標志(因為Framework.xcconfig繼承自Main.xcconfig ...)。

自定義配置

如果我們希望能夠分析應用程序但設置了DEBUG標志怎么辦? 分析應該使用與Release相同的優化標志來完成。 但是我們絕對不想為Release版本設置DEBUG標志。

為什么不創建一個新配置,我們稱之為Profiling 問題來了! 當然,我們應該在主項目中創建這個新配置 然后我們編輯我們的方案和Profile ,在Build Configuration 下我們選擇了新的配置Profiling

現在我們可以在Main.xcconfig文件中為Profiling設置DEBUG標志。

OTHER_SWIFT_FLAGS[config=Debug] = -D DEBUG // we keep this
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = DEBUG // we keep this
OTHER_SWIFT_FLAGS[config=Profiling] = -D DEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Profiling] = DEBUG

我們嘗試運行模擬器,我們看到“沒有調試標志!” ,這是預期的,因為我們使用Debug配置運行,因此不聲明DEBUG標志。

所以我們嘗試分析並開始一些儀器測量並打開控制台 在那里我們看到消息“DEBUG flag set”

它有效,太棒了!

配置不是從父項目繼承的

我們剛剛檢查了 Main 項目中的DEBUG標志。 如果我們在我們的一些框架中想要檢查我們的標志會發生什么。 所以我們在一些框架中嘗試#ifdef DEBUG 這是有效的,因為所有框架都有配置Debug ,因為它是所有項目的默認值(連同Release )。

然后我們在我們的框架項目之一中嘗試#ifdef DEBUG並再次開始使用 Instruments 進行分析。 現在我們看到消息“沒有調試標志!”

哦不! 它不工作! 為什么不呢?! 好吧,我不知道,但唯一合理的結論必須是我們作為依賴項添加的項目 - 我們的框架 -沒有從 Main 項目繼承Profiling配置

對我來說這是難以置信的......感覺就像是 Xcode 中的一個缺陷。

糟糕的解決方案

除了向所有框架項目添加相同的配置Profiling之外,我不知道還有其他解決方案(至少對於我知道我想檢查該標志的框架)。 但這感覺就像一個丑陋的解決方案! . 我至少有 10 個框架,不得不為每個框架添加某種配置感覺真的很丑陋。

替代(可怕!)解決方案

是的,當然另一種解決方案是使用Release配置進行分析,並在Main.xcconfig聲明DEBUG標志,如下所示:

OTHER_SWIFT_FLAGS[config=Release] = -D DEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = DEBUG

但是由於我們希望能夠檢查框架中的DEBUG標志,因此我們需要將上面兩行聲明標志的行也添加到Frameworks.xcconfig中。

當然,使用Release配置進行分析作為該方案的構建配置

然后我們可以向我們的 Main 項目添加一個名為AppStore的新配置,並且只有 Main 項目並使用它來歸檔應用程序。 到目前為止還好嗎?

這是一個陷阱!

不,這不是一個好主意! 因為我剛才說了配置不是在項目和父項目之間繼承的。 因此我們的框架不會繼承這個新的AppStore配置,所以當框架被構建/歸檔時,我看到它們“回退”到Release配置(不確定你是否可以在某處選擇“默認”/“回退”配置?也許它會回退到您用作新配置基礎的那個?)。

但是由於我們剛剛為 Main 項目和所有框架的配置Release添加了DEBUG標志的聲明,並且當我們歸檔應用程序時,所有框架都使用Release配置=>我們的生產應用程序將包含調試代碼! . 這是非常不受歡迎的和潛在的危險。

好的解決方案?

我不知道...你呢? 如果從父項目繼承配置不是很好嗎? 這樣就能解決一切! 蘋果……漂亮嗎?

解決方法:為每個項目和全局文件創建 xconfig 文件。 在項目 xconfig 文件中,通過

#include "path/to/File.xcconfig"

希望這有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM