Xcode Configuration Settings Fil

2020-02-29  本文已影响0人  西西的一天

自定义xcconfig

大多数项目都使用了Cocoapods作为依赖管理。当运行完pod install后,Cocoapods会创建xcconfig文件,并将这个配置添导入项目,如下图所示:

cocoapods xcconfig.png

那么此时,如果需要自定义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_URLvalue必须为$(BASE_URL),value中的BASE_URL需要和xcconfig中的key同名。代码中:

Bundle.main.infoDictionary!["BASE_URL"]! // 忽略 !

在Cocoapods的项目中添加新的Build Configuration

一般项目中会有多个环境,比如DebugSITUATProduction,添加后,需要从新运行pod install,Cocoapods会自动生成该新增Configuration的xcconfig文件。

add build configuration.png

继承关系

编译项的继承关系如下所示,从Target Build Settings一直向上继承,Target Build Settings也就是我们从Xcode中的Build Settings

target build setting.png

下面,我们从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值。

上一篇下一篇

猜你喜欢

热点阅读