Xcode-Pbxproj文件简介

376 阅读2分钟

1、创建例子寻找问题

  1. 我们先创建一个空project,再新建一个target,选择 macOS 类型的Command Line Tool(命令行工具) image.png

  2. 此时会生成一个main.m文件 image.png

  3. 然后在这个target下的 Build Phases 中我们能看到,Compile Sources中自动将main.m文件添加了进来 image.png

  • 问题:为什么Xcode能准确的将main.m添加到 Compile Sources 中,而不是 Dependencies 或者 Link Binary 呢?

2、Pbxproj文件(工程配置核心文件)

  • Xcode工程管理 中我们知道,在项目名.xcodeproj文件的包内容中,都存在1个project.xcworkspace文件和1个project.pbxproj文件,前者是project的workspace文件,而后者就是project的工程配置文件

2.1、参数介绍

  1. 为了有对比添加文件后的参数变化,我们先删掉project的target留个空project,然后用VS打开 project.pbxproj文件(有个pbx插件辅助看文件) image.png

  2. 能看到 pbxproj文件包含的几种Key:

    key描述
    archiveVersion当前文件的生成版本
    classes无意义
    objectVersion当前文件内objects的描述版本
    objects字典,以每个object的UUID作为keyobject的属性(Private、Public等)作为value
    rootObject当前文件的根object的UUID(isa = PBXProject)
  3. rootObject表示 当前文件的根object的UUID,那么我们就搜一下它UUID image.png

    • 每个object都有一个key名为isa,用来表明 当前是什么object
    • 每个object也有key名为attributes,用来表明 当前object特性,以及包含的其他object的UUID描述object的依赖与包含关系
  4. object类型

    pbxproj⽂件,已知的object:
     PBXBuildFile
     AbstractBuildPhase
     PBXBuildRule
     XCBuildConfiguration
     XCConfigurationList
     PBXContainerItemProxy:⽤来代指当前project包含的其他project
     PBXFileReference
     PBXGroup
     PBXProject
     PBXTargetDependency
     PBXReferenceProxy:当前project引⽤的,相同空间的其他project的⽂件
     AbstractTarget
    

2.2、文件分析

  1. 我们随便创建一个文件LZObject image.png

  2. 再来看pbxproj文件,直接全局搜LZObject,能看到文件的多种信息 image.png

  3. 我们按开始的方法将main.m添加进来,再搜main.m文件能发现其有了不同的参数信息,也正是准确添加到 Compile Sources 中的原因 image.png

注:sourceTree
sourceTree的值描述
<absolute>绝对路径
<group>相对于所在group路径
SOURCE_ROOT相对于⼯程所在⽬录路径
DEVELOPER_DIR相对于DEVELOPER_DIR⽬录路径
BUILT_PRODUCTS_DIR相对于产物所在⽬录路径
SDKROOT相对于SDK⽬录所在路径