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/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容