目录
快速开始
一、修改编译产物路径
通过配置 CONFIGURATION_BUILD_DIR 环境变量来修改
二、.pbxproj文件
文件记录了:
项目配置:项目名字、版本信息
文件引用:使用了哪些源代码文件和资源文件
目标设置:target的编译选项和链接选项
依赖关系:target之间的依赖关系
操作.pbxproj文件可以修改项目的各种配置和依赖关系等等,如何修改呢?
cocoapods提供了命令行工具:xcodeproj
cocoapods就是通过修改.pbxproj文件来管理项目和依赖关系的
几个常用的操作
一、修改产物路径
一个workspace下,两个project,project下的target名称都叫LCCat
那么这两个构建产物放在同一个目录下是会报错的
参考cocoapods的脚本文件(/XYApp/Pods/Target Support Files/Pods-XYApp/Pods-XYApp.debug.xcconfig),将产物输出到指定的路径
修改产物的存放位置,在xx.xcconfig文件中配置:
# CONFIGURATION_BUILD_DIR 为构建产物的存放位置
CONFIGURATION_BUILD_DIR = ${SRCROOT}/${PROJECT_NAME}
我们看下cocoapods对AFN的构建产物是如何存放的?
找到AFN的构建产物,然后右键show in finder
我们可以看到在构建产物的前面添加了一个AFNetworking的目录
cocoapods是如何做到的?
然后我们打印下AFNetworking这个target的环境变量
可以知道是通过配置了 CONFIGURATION_BUILD_DIR 来实现改变构建产物输出路径的
二、引用其它shell的环境变量
xcconfig文件中的内容
HMAP_PATH="aa" "bb" "cc"
TTY=/dev/ttys002
# source ~/.zshrc 加载Zsh Shell的配置文件 .zshrc 到当前Shell环境中
# 因为zsh和xcode的shell不是同一shell,想要在xcode中使用zsh的环境便令需要进行加载
# ;用于隔离指令和隔离语句
# 空格隔离的字符串可以用for来遍历
CMD= source ~/.zshrc; git status; for i in $HMAP_PATH; do echo $i;done
Run Script中的内容
if [[ -n $TTY ]]; then
eval $CMD &> $TTY
echo $? &> $TTY
fi
三、自制命令行工具
1、代码如下
// argc:参数个数
// argv:传递的参数
// char** env 也是一个数组,环境变量
// 在xcode中llvm可以使用 parray n argv 来调试数组。n:表示输出几个元素
int main(int argc, const char * argv[], char** env) {
if (argc < 2) {
fprintf(stderr, "%s\n", "请输入参数,或者输入--help查看可用参数");
return EX_USAGE;
}
while (*env){
printf("%s\n", *env++);
}
// 获取配置的环境变量
char *cat = getenv("LG_CAT_ENV");
return 0;
}
2、制作命令行工具
在工程的根目录下执行
# 显示所有的配置项(环境变量)
xcodebuild -showBuildSettings
# 找到Build_DIR,这就是存放构建产物的露露
BUILD_DIR = /Users/lxy/Library/Developer/Xcode/DerivedData/LGCat-gnpihysabhvurnglqyzuklcmosdi/Build/Products
# 打开目录将产物移动的 /usr/local/bin目录下
mv LGCat /usr/local/bin/
3、使用命令行工具
22:37:59 › which LGCat
/usr/local/bin/LGCat
22:40:21 › file /usr/local/bin/LGCat
/usr/local/bin/LGCat: Mach-O 64-bit executable arm64
22:40:31 › LGCat
请输入参数,或者输入--help查看可用参数
22:40:40 › LGCat --help
CA_DEBUG_TRANSACTIONS=1
TERM_PROGRAM=Apple_Terminal
SHELL=/bin/zsh
...
pbxproj文件
一、*.pbxproj文件介绍(GPT)
在iOS应用的Xcode工程中,.pbxproj 文件是一个非常重要的文件,它存储了Xcode项目的配置信息、文件引用、目标设置等。这个文件采用了Property List (plist) 格式,是一个纯文本文件,但内容通常是不易人工编辑的。
以下是.pbxproj文件的主要作用和结构:
作用:
项目配置信息: 包括项目的基本配置,比如项目的名字、版本、支持的iOS版本等。
文件引用: 记录了项目中使用的文件,包括源代码文件、资源文件等。
目标设置: 包括了项目中的每个目标(target)的设置,比如编译选项、链接选项等。
依赖关系: 记录了目标之间的依赖关系,比如一个库可能依赖于其他的库。
结构:
.pbxproj 文件的结构比较复杂,由于是JSON格式的plist文件,它包含了一系列的键值对,其中包含了Xcode项目的各种设置。
根对象(Root Object): 文件的根部分,是一个字典(dictionary)对象。它包含了整个项目的配置信息、目标、文件引用等。
对象(Objects): 包含了项目中所有的对象,比如文件、目标、配置等。每个对象都有一个唯一的标识符(isa属性),用于在文件中引用。
配置文件(Build Configuration Files): 包含了构建配置的信息,例如Debug和Release配置。
文件引用(File References): 记录了项目中的所有文件,包括源代码、资源文件、图像等。每个文件都有一个唯一的标识符。
目标(Targets): 项目中的每个目标都有一个条目,包含了该目标的配置信息、依赖项等。
编辑.pbxproj 文件通常是通过Xcode进行,因为手动编辑这个文件可能导致严重的配置问题。如果需要对Xcode项目进行更复杂的配置,最好使用Xcode提供的界面和工具。
二、pbxproj文件格式
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 55;
objects = {
32D0E7200A98E65B5000E84E /* Products */ = {
isa = PBXGroup;
children = (
);
name = Products;
sourceTree = "<group>";
};
54D3C6EA28804C9F009003C3 = {
isa = PBXGroup;
children = (
32D0E7200A98E65B5000E84E /* Products */,
EC38E118B4FEFAF22398A45F /* LGCat.h */,
);
sourceTree = "<group>";
};
};
rootObject = 54D3C6EB28804C9F009003C3 /* Project object */;
}
最外层的数据格式是
archiveVersion:当前文件的生成版本
objectVersion:当前文件内 objects的描述版本
classes:占位,没有实际意义
objects:字典,以每个object的UUID作为key,object的属性作为value
rootObject:当前文件的根object的UUID(isa = PBXProject)
三、文件内key的介绍
每个object是一个字典
每个object都有一个isa key,用来表明当前是什么object
每个object也有很多attributes key,用来表明当前object特性。以及包含的其他 object的UUID,描述object的依赖和包含关系
1、已知的object:
PBXBuildFile AbstractBuildPhase PBXBuildRule XCBuildConfiguration XCConfigurationList
逻辑教育Cat
PBXContainerItemProxy:用来代指当前project包含的其他project
PBXFileReference PBXGroup
PBXProject PBXTargetDependency
PBXReferenceProxy?:当前project引用的,相同空间的其他project的文 件
AbstractTarget
2、已知的AbstractTarget:
PBXNativeTarget:正常
PBXAggregateTarget:代表一组文件,占位target
PBXLegacyTarget:使用外部构建工具的生成的target
3、已知的 PBXGroup:
XCVersionGroup:包含多个不同版本的文件( CoreData)
PBXVariantGroup:本地化文件
4、已知的 PBXGrAbstractBuildPhase:
PBXCopyFilesBuildPhase
PBXResourcesBuildPhase
PBXSourcesBuildPhase
PBXFrameworksBuildPhase
PBXHeadersBuildPhase
PBXShellScriptBuildPhase
5、sourceTree:
<absolute>:绝对路径
<group>:相对于所在group路径
SOURCE_ROOT:相对于工程所在目录路径
DEVELOPER_DIR:相对于DEVELOPER_DIR目录路径
BUILT_PRODUCTS_DIR:相对于产物所在目录路径
SDKROOT:相对于SDK目录所在路径
操作pbxproj
一、操作文件的方式
xcodeproj提供的API接口
cocoapods的命令行工具:xcodeproj
xcode的内置工具:
二、一个演示
在podfile文件内编写下面内容,执行pod install 会将LGCat.h文件引用到工程中
# workspace函数 参数
workspace './LGWorkspace.xcworkspace'
p 'Cat----'
#引用模块
# ruby 执行环境内置变量$LOAD_PATH
#这个模块是怎么找到的,内置变量$LOAD_PATH拼接上模块名
require 'xcodeproj'
app_project_path = './LGProject.xcodeproj'
project = Xcodeproj::Project.open(app_project_path)
file_path = './LGCat.h'
project.new_file(file_path)
project.save
行者常至,为者常成!