自定义xcconfig
大多数项目都使用了Cocoapods作为依赖管理。当运行完pod install
后,Cocoapods会创建xcconfig文件,并将这个配置添导入项目,如下图所示:
那么此时,如果需要自定义Build Configuration,同时保留Cocoapods为我们添加的配置,就需要用到#include
,下面我们给Debug添加一个Build Configuration,新建文件,类型为Configuration Settings File
,并将Cocoapods自动生成的xcconfig以include的方式引入即可:
#include "Pods/Target Support Files/Pods-ConfigFile/Pods-ConfigFile.debug.xcconfig"
同时还需要在Xcode中将Configuration更改为我们刚刚添加的文件即可:
customized configuration.png
通常情况下,我们添加自定义Build Configuration,都是为了为不同的环境添加不同的配置参数,比如BASE URL,在xcconfig文件中,格式为 key = value
:
#include "Pods/Target Support Files/Pods-ConfigFile/Pods-ConfigFile.debug.xcconfig"
BASE_URL=http:/$()/www.domain.com
这里需要注意一点是,在xcconfig文件中,//
会被识别为注释,所以使用/$()/
可以巧妙的解决这个问题。添加了配置后需要在代码中使用,需要在info.plist中添加一项key
可以随便取一个这里暂时也用BASE_URL
,value
必须为$(BASE_URL)
,value中的BASE_URL
需要和xcconfig中的key同名。代码中:
Bundle.main.infoDictionary!["BASE_URL"]! // 忽略 !
在Cocoapods的项目中添加新的Build Configuration
一般项目中会有多个环境,比如Debug
,SIT
,UAT
,Production
,添加后,需要从新运行pod install
,Cocoapods会自动生成该新增Configuration的xcconfig文件。
继承关系
编译项的继承关系如下所示,从Target Build Settings一直向上继承,Target Build Settings也就是我们从Xcode中的Build Settings。
- Platform Defaults
- Xcode Project xcconfig File
- Xcode Project File Build Settings
- Target xcconfig File
- Target Build Settings
下面,我们从Cocoapods自动生成的xcconfig文件中了解一下Xcode Build Settings的继承
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_LDFLAGS = $(inherited) -framework "Accelerate" -framework "Alamofire" -framework "CFNetwork" -framework "Kingfisher"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
从中挑一个来理解HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers"
这个Header Search Path是经常会涉及到的,当添加了第三方依赖,依赖的头文件会从这个路径里查找。最底层的Target Build Settings
定义在project.pbxproj
文件中,在该文件中,在编译过程中,会先尝试从该文件中查找HEADER_SEARCH_PATHS
,若找到了会以该值作为查找header的路径,找不到则会依次向父级查找,在这个演示中,它的父级便是Pods-ConfigFile.debug.xcconfig
,在这个config文件中HEADER_SEARCH_PATHS
由一个字符串数组组数组成,以空格做分割,其中的第一个元素$(inherited)
表明,它将继承它的父级的配置,它的父级则是Xcode Project xcconfig File
,以此类推。
Tips: 当我们刚创建好工程时,在
project.pbxproj
文件中是没有HEADER_SEARCH_PATHS
,所以默认会从Pods-ConfigFile.debug.xcconfig
获取。
还有一些其他的语法如,条件语法:
BUILD_SETTING_NAME[sdk=xxx][arch=yyy] = VALUE
这个语法表明在sdk为xxx,并且arch为yyy时,取后面的VALUE值。
网友评论