iOS使用 xcconfig配置檔案的若干坑
有一些文章介紹.xconfig檔案的使用,如這篇,但是經過親自實踐,發現還是有一些坑,這裡記錄下。
構建新的configuration
這一步在“project-info-configuration”位置進行,點選“+”構建“-”消除,沒什麼問題,這個很簡單也不會出錯。

只是原來使用 xcodebuild
進行 ofollow,noindex">自動打包 時的 -configuration
指的是就是這裡啊。每個專案預設就有的 Debug和Release
配置。
這個 Configuration
是對於同一個專案的配置的一個完整的最高的總結了。
使用.xcconfig檔案
新建這個檔案很簡單,xcode自帶了這個模板。然後是在 Configuration
裡配置,比如在 debug 時使用 First.xcconfig
在 release 時使用 Second.xcconfig
,如圖:

這一步也簡單。但是我開始使用的時候,思維就走錯方向了:
根據各種文章的指示,配置檔案(.xcconfig)裡面的內容會覆蓋當前的 Build Settings
裡面的東西,所以我以為是我在配置檔案裡面寫了一個配置,那麼 Build Settings
裡面的東西會跟著變。
比如我現在是 Debug
環境,然後對應的就是 First.xcconfig
,我在它裡面寫入:
//:configuration = Debug OTHER_LDFLAGS = -Objcxxx //:configuration = Release OTHER_LDFLAGS = -Objcxxx //:completeSettings = some OTHER_LDFLAGS 複製程式碼
其實就是 Other Linker flags
的配置,可是外面 Build Settings
裡的東西並沒有變。

我就暈了,這到底怎麼回事。
這裡有兩個坑
- 專案的
Build Settings
裡直接寫的內容是會優先顯示的,就是說Xcode有一個預設的配置檔案(yourAppName.xcodeproj/project.pbxproj),如果你直接在Build Settings
裡編輯,是寫到它裡面去,比如只是修改了other linker flag
,再看github的修改:

這個檔案裡的配置會優先在 Configuration
裡指定的 .xcconfig
檔案裡的配置,那要怎麼使用 .xcconfig
檔案裡的配置?刪掉 Build Settings
裡的配置就好了。 Command+delete
搞定。
-
因為
.xcconfig
配置檔案很難寫,主要是各種配置名你記不住,所以就到實際的Build Settings
裡面去拷貝,就在對應的配置項Command+C
就有了,所以內容就變成了上面那樣,我以為3句話是在不同環境下起作用的,是互不干擾的,其實是OTHER_LDFLAGS
設了3遍,左後一次生效,最後是啥?空的啊,所以即使刪除了Build Settings
裡的內容也不出現,我還以為.xcconfig
檔案沒起作用!所以改成:
OTHER_LDFLAGS = -Objcxxx
然後就有了。
環境切換配置也跟著切換?
首先使用配置檔案的作用就是,在環境切換後,配置可以跟著一整套的切換, .xcconfig
就相當於一個把相關的配置打包了。
這裡就有了另一個坑,或者說理解失誤:
我以為是你在 Build Configuration 裡選擇什麼,那麼 Build Settings 裡的內容會跟著改變。

實際上 Build Settings 還是原來那樣,改變的是每一項裡面的內容,比如First.xcconfig配置裡寫入 OTHER_LDFLAGS = -Objc_first
,而Second.xcconfig裡寫入 OTHER_LDFLAGS = -Objc_second
,在外面看到的是這樣的:

每一項配置裡面會再分成Debug、Release等不同的Configuration,而不是 Build Settings 整體切換了。
或者說這是一個結構上的問題,讓新接觸者會改不清楚Xcode到底是什麼做到不同情況使用不同配置的。
整個配置的結構
實際結構是這樣:
- 最上層就是 Project-info-Configuration 裡的配置了
- 然後每個配置裡可以有不同配置檔案(.xcconfig),每個 target 一個配置檔案
- 然後是每個配置檔案裡面有許多的配置項
但是在 Build Settings 的顯示裡,這個結構是倒過來的:
- 配置檔案
- 配置項
- 不同Configuration
另外,關於巨集
在整個 Build Settings 裡,可以在程式碼裡直接使用的, Preprocess Mcros
就是其中之一。
在這裡定義不同的巨集,就可以在程式碼裡由此做不同處理,比如預設的 DEBUG
巨集就經常用來做條件編譯。
在 Build Settings 裡可以 $(xxx)
來引用其他配置裡的東西,那麼也就可以在這裡定義巨集並且跟隨其他配置而改變。