JHHK

欢迎来到我的个人网站
行者常至 为者常成

2.简单介绍pbx文件

目录

快速开始

一、修改编译产物路径

通过配置 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

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.