Xcode 基础工程结构解析

Xcode 基础概念
这里只讨论单project,不讨论多project间引用

流程 作用
project Projectn == 项目,管理所有Target,默认配置
target 最小可编译单元,一个target一个输出,可以是App,静态库,动态库等
scheme build target时,用以唤起对应target,以及对应配置的一个action map
xcodeproj 项目目录下文件夹,可用来启动项目
xcworkspace 项目目录下cocoapods 工程文件夹,可用来启动项目,同时,在xcodeproj中也有此文件夹
pbxproj 记录xcode 工程文件结构

Project

Xcode Project是构建一个或多个软件产品所需的所有文件,资源和信息的存储库。项目包含用于构建产品的所有元素,并维护这些元素之间的关系。它包含一个或多个Target,用于指定如何构建产品。项目为项目中的所有Target定义默认的构建设置(每个Target也可以指定自己的构建设置,这些设置将覆盖项目的构建设置)。

Target

Target指定要构建的product,并包含构建product的配置信息。Target定义单个product;it organizes the inputs into the build system—the source files and instructions for processing those source files—required to build that product。项目可以包含一个或多个Target,每个Target产生一个product。

构建产品的配置信息采用build settings和build phase的形式,您可以在Xcode项目编辑器中进行检查和编辑。Target会继承project build setting,但是您可以通过在Target级别指定不同的设置来覆盖任何project setting。一次只能有一个活动Target。 Xcode scheme指定了活动Target。

scheme

Xcode scheme 定义了要构建的Target的集合,构建时要使用的配置以及要执行的测试的集合。

您可以根据需要设置多个scheme,但一次只能激活一个。 您可以指定scheme是否应存储在Project中(在这种情况下,它可以在包含该Project的每个工作区中使用,也可以在工作区中使用),在这种情况下,它仅在该工作区中可用。 选择活动scheme时,还将选择运行Target(即,为其构建产品的硬件的体系结构)。

build settings

构建设置是一个配置,其中包含有关应如何执行产品构建过程的特定方面的信息。例如,构建设置中的信息可以指定Xcode传递给编译器的选项。

xcodeproj

xocde 工程文件夹,包含了,单project时,使用它就可以了

project.xcworkspace
project.pbxproj
scheme

xcworksapce (xcode workspace)

worksapce是将项目和其他文档分组的Xcode文档,因此您可以一起处理它们。worksapce可以包含任意数量的Xcode项目,以及您想要包含的任何其他文件。除了组织每个Xcode项目中的所有文件之外,worksapce还提供了包含的项目及其目标之间的隐式和显式关系。

cocoapods 工程的方案就是生成Pods 工程,与默认工程产生依赖关系

pbxproj

project.pbxproj的整体结构(根节点)
// !$*UTF8*$!
{
    archiveVersion = 1;
    classes = { };
    objectVersion = 46;
    objects = {
/* Begin PBXBuildFile section */
        1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
        3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
        74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
        97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
        97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
        97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
        9705A1C41CF9048500538489 /* Embed Frameworks */ = {
            isa = PBXCopyFilesBuildPhase;
            buildActionMask = 2147483647;
            dstPath = "";
            dstSubfolderSpec = 10;
            files = (
            );
            name = "Embed Frameworks";
            runOnlyForDeploymentPostprocessing = 0;
        };
/* End PBXCopyFilesBuildPhase section */
...};

    rootObject = 97C146E61CF9000F007C117D /* Project object */;
}

project.pbxproj 的大致结构

PBXBuildFile

文件的引用由 PBXBuildFile 中属性 fileRef 指向 PBXFileReference,它有一个path属性标明文件路径,但需要注意的是这里的 path 显示的路径可能不是项目目录下的全路径,只是显示文件名,要得到文件全路径,需要使用 PBXFileReference 的 UUID 索引到 PBXGroup、PBXReferenceProxy等中一层层递归向上搜索路径来拼接成全路径。

objects 的键值对根据内容类型被分成了若干个 section,采用注释的方式分节也使得可读性更强。section 的数量跟工程有关,尤其是每个工程的 BuildPhase 和 Target 差别都很大,section 列表就是上图中objects后的分支结构,显示在 Xcode 中能看见所有的公共配置信息都存在于 project.pbxproj 中。主要包含跟文件相关的 BuildFile,Group 和 FileReference,跟编译相关的 BuildPhase 和 Build Configuration(List),以及一些列 Target 和 TargetDependency等。

参考资料

https://developer.apple.com/library/archive/featuredarticles/XcodeConcepts/Concept-Schemes.html
https://developer.apple.com/library/archive/navigation/
https://segmentfault.com/a/1190000017278975
http://www.tomorjm.com/xcodeproj-1/

你可能感兴趣的:(Xcode 基础工程结构解析)