通过Xcodeproj深入探究Xcode工程文件 一
前言
你是否好奇Cocoapods是如何修改掉Xcode工程的结构?你也是否曾被Xcode工程的配置文件里面杂乱的内容搞得摸不清头脑?你又是否知道Xcodeproj这个神奇的Ruby库?下面我将通过这个系列来解除你的困惑。
Cocoapods是如何修改Xcode工程结构的?
我们知道Cocoapods是用ruby创作的一套第三方库,它很方便的可以删除、添加、更新第三方库?当你执行修改完PodFile
执行pod update
的时候,你会惊讶的发现Xcode工程被神奇的修改掉了。那么它是如何做到的呢?细心的你会发现,每个Xcode工程都有一个project.pbxproj
文件,这个文件记录着该工程的文件结构。Cocoapods正是通过它的组件Xcodeproj来对工程结构进行修改。
project.pbxproj这个文件里面的内容到底是什么含义?
如果你使用过SVN
或者Git
进行团队协作开发肯定会不可避免的遇到在合并代码的时候往往由于有过添加和删除文件的操作导致Xcode工程报错打不开,这时候一般的解决思路是打开project.pbxproj
文件,Command+F
键入======
或者<<<<<
来找到冲突的地方,将冲突的内容删除。然而有些人并不知道为何要这样解决甚至不知道里面的内容是何意思?下面的内容或许对你有些许帮助。
project.pbxproj介绍
project.pbxproj
采用的是老式风格的plist文件(old ASCII plist),这最早是Next公司采用的一种文件格式,它跟XML
格式很多地方类似,但是又有些许的不同。为了更方便理解,我建议你新建一个工程或者在以后的工程上打开project.pbxproj
,在实例的基础上便于直观感受,更有助于
加深理解。
首先我要介绍它里面的众多元素,例如
|
根节点 PBXBuildFile PBXBuildPhase PBXAppleScriptBuildPhase PBXCopyFilesBuildPhase PBXFrameworksBuildPhase PBXHeadersBuildPhase PBXResourcesBuildPhase PBXShellScriptBuildPhase PBXSourcesBuildPhase PBXContainerItemProxy PBXFileElement PBXFileReference PBXGroup PBXVariantGroup PBXTarget PBXAggregateTarget PBXLegacyTarget PBXNativeTarget PBXProject PBXTargetDependency XCBuildConfiguration XCConfigurationList |
在万物皆对象
的概念下,你尚可将他们理解为一个个类
,它们里面的各个子元素就是一个个对象
。最外层的每个元素如PBXBuildFile
被称为一个个
Section
,为方便理解,文章后面的内容我都将这些元素称为类,将元素的实例成为对象。
project.pbxproj的整体结构(根节点)
|
// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 45; objects = {...}; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; } |
如果你已经打开了一个project.pbxproj
,你就会很容易看到这种结构,只不过objects
里面的各种类属于第二层结构,rootObject
位于文件的最后一行。
唯一标识码
细心的你会看到,上面的根节点里面的rootObject
后面是一串24位的16进制数
,它就是每个对象的唯一标识码,它可以唯一标识文件的每个对象,也就是说
每个元素的标识码都是不同的。Xcode生成唯一标识码的算法可能引入了日期、序列和其它一些预定义的值,但是并没有确切的文档说明具体的生成过程。值得注意的是,该唯一标识码不仅在所在的工程中唯一,而且还是跨工程唯一。
PBXBuildFile
PBXBuildFile
是文件类,被PBXBuildPhase
等作为文件包含或被引用的资源。此时我已经新建了一个名为Xcode工程Demo
的工程,此时的工程结构是这样,如图1所示。而此时的project.pbxproj
中PBXBuildFile
的结构如图2所示。
图1
图2
可以清楚的看到每个PBXBuildFile
对象都是由以下的结构组成
|
4D05CA6B1193055000125045 /* xxx.c in Sources */ = { isa = PBXBuildFile; fileRef = 4D05CA411193055000125045 /* xxx.c */; }; |
图3
其中isa
跟Objc中的对象的isa指针一样,指向的是它的类,而fileRef
则指向的是一个PBXFileReference
对象,这个类将在下面介绍。
细心的你又会发现,为什么图1和图2中的文件个数不一致,却和图3中编译时的文件和资源统一。前者的差异是由于PBXFileReference
所致,通过后者我们可以大胆猜测,PBXBuildFile
中的对象是编译时候需要确认的文件和资源的集合,如果不信的话可以拖几张图片资源扔进工程中
,经过验证结果和预测的情况一致。
PBXFileReference
PBXFileReference
用于跟踪项目引用的每一个外部文件,比如源代码文件、资源文件、库文件、生成目标文件等。具体表现如图4。
图4
它的结构如下:
|
87293F901153D870007AFD45 /* objc.mm */ = { isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = monobjc.mm; path = sources/monobjc.mm; sourceTree = ""; }; |
里面的每个key的含义,对照着实际工程,大家不妨自行揣测。
我们再将PBXBuildFile
和PBXFileReference
放一起进行对比,如图5。
图5
AppDelegate.swift
对象通过fileRef
指向标识符为F3E1481A1DA50A180059397C
的PBXFileReference
对象,通过这个引用,一个PBXBuildFile
对象就可以查到自己的具体信息,如fileType
、name
和path
等信息。
PBXGroup
PBXGroup
用于组文件,或者嵌套组。让我们来看下实例,如图6
图6
怡然是通过唯一标识符组装,每个PBXGroup
对象都有一个children
属性,里面可以是任何一种类的对象。但是这时候的PBXGroup
指的是Xcode里面组织的分组结构,和实际文件系统中的结构并不相同。
指的注意的是,children
中的每个文件对象都属于PBXFileReference
类,而不是PBXBuildFile
类
PBXNativeTarget
PBXNativeTarget
就是工程中的target,如果工程中有多个target,都会在这个section中有所体现。
实例中如图7所示
图7
我们都知道每个target都有Compile Sources
、Copy Bundle Resources
、Link Binary With Libiaries
这三个需要在编译时确定的内容。
而在PBXNativeTarget
中通过buildPhases
属性可以找到对应的内容。
PBXSourcesBuildPhase和PBXResourcesBuildPhase
PBXSourcesBuildPhase
用于构建阶段中编译源文件,PBXResourcesBuildPhase
用于构建阶段需要复制的资源文件,如图8
图8
需要注意的是,PBXSourcesBuildPhase
这个section中放着所有的target的同类对象,PBXResourcesBuildPhase
也是一样。
PBXProject
PBXProject
标识着整个工程,由根元素的rootObject
引入。如图9所示
图9
该对象记录着targets
、mainGroup
等重要信息,甚至每个target在创建时候的Xcode版本都会记录在其中。
其他元素
还有其他很多重要的元素,如记录工程配置信息的XCConfigurationList
和XCBuildConfiguration
等,大家可以自行研究研究。
总结
通过上面的内容,我画了一张图总结一下,如图10
图10
由此看来,以前看到就头疼的project.pbxproj
配置文件的内容并没有想象中的复杂,也可以看出Xcode文件组织的严密和周整。
大家自己研究的时候,不妨可以动手改改项目中的内容,再去观察配置文件的变化,这样既可以有更深的理解,或许有新发现也说不定奥。
下篇文章,我将带大家用Xcodeproj这个库来,通过几行代码修改project.pbxproj
中的内容以达到通过脚本去修改Xcode工程和分析工程的目的。
原文链接:http://www.tomorjm.com/year/10/05/通过Xcodeproj深入探究Xcode工程文件%20一/
通过Xcodeproj深入探究Xcode工程文件 一相关推荐
- 通过Xcodeproj深入探究Xcode工程文件
你是否好奇Cocoapods是如何修改掉Xcode工程的结构?你也是否曾被Xcode工程的配置文件里面杂乱的内容搞得摸不清头脑?你又是否知道Xcodeproj这个神奇的Ruby库?下面我将通过这个系列 ...
- Xcode工程文件pbxproj
Xcode工程文件pbxproj Xcode会去读Project.pbxproj文件,把pbxproj转成plist文件,看起根目录结构 rootObject:指向的是我们的工程对象.(对应一个24个 ...
- Qt工程生成xcode工程文件
前言 xcode 是 Mac 下重要的开发工具,若是用 Qt 开发 Mac/ios 的 App 时,可以使用 xcode 软件进行调试或者配置一些平台属性等等,毕竟是苹果自己的开发工具,使用肯定会比较 ...
- Xcode工程文件无法打开
解决方法:1.对.xcodeproj 文件右键,显示包内容 2.双击打开 project.pbxproj 文件 3.找到以上类似的冲突信息(可以用commad + f 搜索) 4.删除 << ...
- 集成Reveal:不修改您的Xcode工程并加载Reveal
转载于:http://support.revealapp.com/kb/getting-started/revealxcodereveal 此方法仅适用于在iOS模拟器上运行的应用. 通过不修改Xco ...
- iOS Xcode工程目录的 folder 和 group的区别(蓝色和黄色文件夹的区别)
本文转载至 http://blog.csdn.net/fanjunxi1990/article/details/9352917 XCode工程目录里面,有时你会发现2个不同颜色的文件夹,一种是蓝色的, ...
- Xcode 物理文件夹与工程文件夹
在Xcode 工程中分两种文件夹:物理文件夹(如下图蓝色文件夹),工程文件夹(如下图黄色文件夹) 物理文件夹添加方法如下: 使用 pathForResource:ofType:取出物理文件夹里面的文件 ...
- Xcode工程,蓝色文件夹、黄色文件夹以及 .bundle文件的区别
Xcode工程,蓝色文件夹.黄色文件夹以及 .bundle文件的区别 用过 Xcode 做过开发的应该都知道,在左边的目录索引中,有蓝色的文件夹,黄色的文件夹,还有 .bundle 文件.那么它们都有 ...
- 使用svn删除Xcode工程中的文件
这个问题困扰我好久,一直觉得删除受svn管理的文件就是一个梦魇. 今天同学遇到一个文件重复定义的问题,导致整个工程无法编译,解决的办法是删除之前重复定义的文件,使用自己的命名规则来命名一个新的文件. ...
最新文章
- Linux shell脚本判断服务器网络是否可以上网
- 用dedecms自定义表单创建简易自助预约系统
- JS中包含其它JS文件
- 关于element click intercepted报错解决办法
- 淘宝2011.9.21校园招聘会笔试题
- 病从口入 这样吃小心癌症找上门
- from表单提交和JSON区别
- linux通过I2C地址查看设备名称
- 12星座的出生年月日性格_星座六点半/今日12月04日:双鱼、巨蟹、天蝎座运势...
- 第10月第25天 java annotation
- Dubbo 集成 ZooKeeper 注册中心实现服务调用
- 前端urldecode 特殊字符处理导致后端无法解析
- matlab泊松分布图,将泊松分布拟合到MATLAB中的一组数据
- 计算机工程师相关政策,计算机中级工程师论文发表(发表时机和要求)
- oracle中取月初和月末的方法
- 旭凤锦覓虐心 恋只愿共赴鸿蒙,香蜜:锦觅与旭凤4次同床,1次酒醉灵修,1次再续前缘,1次虐心!...
- Java生成二维码图片,手机软件扫码后跳转网页
- 如何自建微信外卖平台_本地外面平台怎么起步,如何自建微信外卖平台
- 采用蒙特卡罗方法求解π值
- VS2015官方下载地址(个人免费版)