今天有人问我Target和Project是什么关系?额。。。学习iOS开发都知道Target和Project的关系。这里我就简单的做了一个总结,而且加入的Scheme和Workspace。如果不当的地方,欢迎指教。
废话不多说,如果你的英语够NB,你可以直接看这里: Project 、 Target 、 Workspace 、 Scheme 。下面就简单来介绍一下各位。
简单来说就是一个项目,我们新建一个工程的时候你会发现就会有个Project。它其实是一个包含了所有文件、资源和构建信息的一个存储库。Project包含了用欧冠胡构建产品和维护这些元素之间关系的所有元素。它包含了一个或者多个Target,而这些Target制定了如何构建Products。并且一个Project定义的build settings对于所有的Target都是一样的,你也可以针对某个Target进行定制。
在来点官网的翻译吧。哈哈。
一个Project文件包含了以下的信息:
参考的资源文件:源代码(包括头文件和实现文件)、Libraries和frameworks、资源文件、图片文件、nib文件。等等。
一个project可能是单独的一个,也可能是一个工作空间。
Target的中文名字是目标,就是王健林说的“先实现一个小目标”的那个目标。一个Project可以有多个Target。而且Target是继承自Project的,也就是说如果你在Project中配置了某个东西,那么所有的Target都会生效;但是反之则不会生效。
如果你现在有一个产品,你要做不同的环境出来,包括线上、预发、日常等等。这个时候你就可以来建立多个Target来实现。你先选中Targets里面的默认的第一个,然后右击弹出一个小列表:(Duplicate、Delete、Project Editor Help),顾名思义,Duplicate就是复制的意思,你可以选择一个Target进行复制,然后通过修改其General、Build Settings以及Build Phases来进行定制化修改,在Build Settings里面有一个Preprocessor Macros的选项,你可以直接设置定义宏的方式来对不同的Target进行区分,比如我的:
我这里面建立了三个Targets:OnLine、Daily、Pre。然后通过设置不同的宏定义来进行环境配置,其实很简单:在你设置环境的地方通过宏定义进行判断:
#ifdef Online_CreditPlatForm 线上环境配置 #elif Daily_CreditPlatForm 日常环境配置 #elif Pre_CreditPlatForm 预发环境配置 #else 默认环境配置 #endif
这样就可以直接在:
选择不同的Scheme run就可以了。不用每次都去修改ip配置。此外,你还可以对每个Target进行其他的配置,比如icon、Display Name等等。到这里你也许会发现我的Target名字是按照我的意愿写的,而直接复制的名字后面是copy copy2等等,这样很不友好,而且不方便识别,你可以按照下面的步骤进行修改名称:
首先,打开Manage Schemes…弹出如下的界面:
然后选中你要改名的Scheme,然后按Enter键,输入你想要的名字就行了比如我直接设置成了OCLintDemo_pre。
然后,在TARGETS里面选中你要修改名字的Target,同样的方法设置成OCLintDemo_pre:
最后,如果你觉得刚才创建Target对应的plist文件名字也不太友好,如图:
可以在指定Target里面Build Settings里面的Packaging中Info.plist File里修改为自己想要的(OCLintDemo-pre-Info):
这样就修改成了自己所需要的名称。
另外,Target还可以设置依赖,有兴趣的可以了解一下。这里就不在赘述了。
所以就我个人理解而言,如果一个产品只是一些配置或者其他的东西有所差异,你可以新建多个Target进行开发,提高开发效率,也提高了打包的速度(至少不用每次添加注释和取消注释)。
如果你的开发过程中用到了Cocoapods,那么你就是已经用到了Workspace,因为你使用Cocoapods之后,你打开的那个文件就是 xxxx.xcworkspace。简单理解他就是一个Xcode文件,它包含了一个project组合,他们能够一起工作。
看Scheme之前,你必须要先了解了Target,要不然请直接忽略Scheme。一个Scheme定义了要build的target的集合,定义了一个当building的时候的配置,定义了一个测试的集合。这里需要注意一点,那就是当你Archive要发布到AppStore的时候,需要将Archive设置为Release
简单来说就是:一个workspace可以包含多个project,一个project可以包含多一个target,Scheme包含了所有的target集合。