有一些文章介紹.xconfig文件的使用臼寄,如這篇饼酿,但是經(jīng)過(guò)親自實(shí)踐吭敢,發(fā)現(xiàn)還是有一些坑,這里記錄下缭受。
構(gòu)建新的configuration
這一步在“project-info-configuration”位置進(jìn)行胁澳,點(diǎn)擊“+”構(gòu)建“-”消除,沒(méi)什么問(wèn)題米者,這個(gè)很簡(jiǎn)單也不會(huì)出錯(cuò)韭畸。
只是原來(lái)使用xcodebuild
進(jìn)行自動(dòng)打包時(shí)的-configuration
指的是就是這里啊。每個(gè)項(xiàng)目默認(rèn)就有的Debug和Release
配置蔓搞。
這個(gè)Configuration
是對(duì)于同一個(gè)項(xiàng)目的配置的一個(gè)完整的最高的總結(jié)了胰丁。
使用.xcconfig文件
新建這個(gè)文件很簡(jiǎn)單,xcode自帶了這個(gè)模板喂分。然后是在Configuration
里配置锦庸,比如在debug時(shí)使用First.xcconfig
在release時(shí)使用Second.xcconfig
,如圖:
這一步也簡(jiǎn)單。但是我開(kāi)始使用的時(shí)候妻顶,思維就走錯(cuò)方向了:
根據(jù)各種文章的指示酸员,配置文件(.xcconfig)里面的內(nèi)容會(huì)覆蓋當(dāng)前的Build Settings
里面的東西,所以我以為是我在配置文件里面寫(xiě)了一個(gè)配置讳嘱,那么Build Settings
里面的東西會(huì)跟著變。
比如我現(xiàn)在是Debug
環(huán)境酿愧,然后對(duì)應(yīng)的就是First.xcconfig
,我在它里面寫(xiě)入:
//:configuration = Debug
OTHER_LDFLAGS = -Objcxxx
//:configuration = Release
OTHER_LDFLAGS = -Objcxxx
//:completeSettings = some
OTHER_LDFLAGS
其實(shí)就是Other Linker flags
的配置沥潭,可是外面Build Settings
里的東西并沒(méi)有變。
我就暈了嬉挡,這到底怎么回事钝鸽。
這里有兩個(gè)坑
- 項(xiàng)目的
Build Settings
里直接寫(xiě)的內(nèi)容是會(huì)優(yōu)先顯示的,就是說(shuō)Xcode有一個(gè)默認(rèn)的配置文件(yourAppName.xcodeproj/project.pbxproj)庞钢,如果你直接在Build Settings
里編輯拔恰,是寫(xiě)到它里面去,比如只是修改了other linker flag
基括,再看github的修改:
這個(gè)文件里的配置會(huì)優(yōu)先在Configuration
里指定的.xcconfig
文件里的配置颜懊,那要怎么使用.xcconfig
文件里的配置?刪掉Build Settings
里的配置就好了风皿。Command+delete
搞定河爹。
-
因?yàn)?code>.xcconfig配置文件很難寫(xiě),主要是各種配置名你記不住桐款,所以就到實(shí)際的
Build Settings
里面去拷貝咸这,就在對(duì)應(yīng)的配置項(xiàng)Command+C
就有了,所以?xún)?nèi)容就變成了上面那樣魔眨,我以為3句話(huà)是在不同環(huán)境下起作用的媳维,是互不干擾的酿雪,其實(shí)是OTHER_LDFLAGS
設(shè)了3遍,左后一次生效侄刽,最后是啥指黎?空的啊,所以即使刪除了Build Settings
里的內(nèi)容也不出現(xiàn)唠梨,我還以為.xcconfig
文件沒(méi)起作用袋励!所以改成:
OTHER_LDFLAGS = -Objcxxx
然后就有了。
配置文件生效了
環(huán)境切換配置也跟著切換当叭?
首先使用配置文件的作用就是茬故,在環(huán)境切換后,配置可以跟著一整套的切換蚁鳖,.xcconfig
就相當(dāng)于一個(gè)把相關(guān)的配置打包了磺芭。
這里就有了另一個(gè)坑,或者說(shuō)理解失誤:
我以為是你在Build Configuration里選擇什么醉箕,那么Build Settings里的內(nèi)容會(huì)跟著改變钾腺。
實(shí)際上Build Settings還是原來(lái)那樣,改變的是每一項(xiàng)里面的內(nèi)容讥裤,比如First.xcconfig配置里寫(xiě)入OTHER_LDFLAGS = -Objc_first
,而Second.xcconfig里寫(xiě)入OTHER_LDFLAGS = -Objc_second
,在外面看到的是這樣的:
每一項(xiàng)配置里面會(huì)再分成Debug放棒、Release等不同的Configuration,而不是Build Settings整體切換了己英。**
或者說(shuō)這是一個(gè)結(jié)構(gòu)上的問(wèn)題间螟,讓新接觸者會(huì)改不清楚Xcode到底是什么做到不同情況使用不同配置的。
整個(gè)配置的結(jié)構(gòu)
實(shí)際結(jié)構(gòu)是這樣:
- 最上層就是Project-info-Configuration里的配置了
- 然后每個(gè)配置里可以有不同配置文件(.xcconfig)损肛,每個(gè)target一個(gè)配置文件
- 然后是每個(gè)配置文件里面有許多的配置項(xiàng)
但是在Build Settings的顯示里厢破,這個(gè)結(jié)構(gòu)是倒過(guò)來(lái)的:**
- 配置文件
- 配置項(xiàng)
- 不同Configuration
另外,關(guān)于宏
在整個(gè)Build Settings里治拿,可以在代碼里直接使用的摩泪,Preprocess Mcros
就是其中之一。
在這里定義不同的宏劫谅,就可以在代碼里由此做不同處理见坑,比如默認(rèn)的DEBUG
宏就經(jīng)常用來(lái)做條件編譯。
在Build Settings里可以$(xxx)
來(lái)引用其他配置里的東西同波,那么也就可以在這里定義宏并且跟隨其他配置而改變鳄梅。