Xcode Concepts--概念Target、Project、Build Setting、Workspace、Scheme

一:Xcode 环境简介html

首先弄清楚一些在XCode环境下的一些概念:ios

Workspace:
简单来讲,Workspace就是一个容器,在该容器中能够存放多个你建立的Xcode Project, 以及其余的项目中须要使用到的文件。xcode

使用Workspace的好处有:
1),扩展项目的可视域,便可以在多个项目之间跳转,重构,一个项目可使用另外一个项目的输 出。Workspace会负责各个Project之间提供各类相互依赖的关系;
2),多个项目之间共享Build目录。app

Project:
指一个项目,该项目会负责管理生成一个或者多个软件产品的所有文件和配置,一个Project能够包含多个Target。ide

Target:
一个Target是指在一个Project中构建的一个产品,它包含了构建该产品的全部文件,以及如何构建该产品的配置。工具

Scheme:
一个定义好构建过程的Target成为一个Scheme。可在Scheme中定义的Target的构建过程有:Build/Run/Test/Profile/Analyze/Archiveui

BuildSetting:
配置产品的Build设置,比方说,使用哪一个Architectures?使用哪一个版本的SDK?。在Xcode Project中,有Project级别的Build Setting,也有Target级别的Build Setting。Build一个产品时必定是针对某个Target的,所以,XCode中老是优先选择Target的Build Setting,若是Target没有配置,则会使用Project的Build Setting。spa

关于如何构建以上环境,请参考devCenter官方指南:.net

https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html命令行

二:Xcode 建立workspace多工程依赖

新建 Xcode workspace
打开 Xcode , 选择 File -> New -> Workspace , 将 Workspace 命名为 Test.xcworkspace , 并选择合适的目录。
三:Xcode 建立子工程以及工程依赖

背景:因为建立一个app的时候须要引入大量的依赖三方库或者本身写的工具类,每次新建app这些事情都须要大量的时间。因此,就考虑建一个公共工程,每次新建项目,只是须要依赖这个工程就好了。
思路设计:①BaseApp,用于存放公共的库。②BaseAppSample用于写demo和示例,方面别人在使用的时候查看和借鉴。
具体步骤:
一、建立BaseApp工程,注意这里被依赖的工程要是Static Library。

二、建立BaseAppSample工程。在BaseAppSample的framework group上面右键,添加文件,选中BaseApp.xcodeproj,创建依赖关系。

行成如上图所示的依赖关系。
三、这样BaseAppSample里面就可使用BaseApp里面的类了么?开始我觉得能够了,但是我错了。在BaseAppSample里面import相关的类会出现找不到的error,会编译错误。须要进行下面的操做:

在Header Search Paths 里面添加引入头文件的路径,如上所示,这样就不会出现编译的error了。
四、等等,好像觉得正确,comand + r。Oh,NO,仍是有错误。仍是编译还出现找不到相关的文件。
这个时候能够判断的是,编译的结果没有可以正确的依赖,进行下面的步骤
添加target的依赖关系,保证编译BaseAppSample的时候先编译BaseApp。
选中BaseAppSample Target,而后选中其Build phases选项,添加BaseApp target

而后把lib也引入依赖中,以下所示:

五、若是被依赖包(BaseApp)中有图片或者依赖文件怎么办?
要把相关的依赖图片copy出去:选中BaseApp target,进入Build phases选项,找到最下面的copy file栏,添加相关的文件:

到这一步,只要command+r,BaseAppSample中就可以正常地引入BaseApp里面的功能了。
之后有公共的组件,只是须要添加到BaseApp中,其余依赖的功能都可以使用了。
为了维护方便,能够把BaseApp用单独的SVN或者Git来维护。
分割线追加:
————————————————————————————————————————
今天右发现新的问题,若是存在category的时候,使用category会致使Crash
解决办法是在Sample里面添加编译的命令:

在Other Linker Flags添加 -Objc和-all_load选项,保证category可以被正常的引入。
原文地址:http://www.ganlvji.com/?p=128

四:在Xcode中添加多个targets
(转载地址: http://blog.csdn.net/ysysbaobei/article/details/10951991)
在ios开发时,咱们常常会遇到对同一个app开发多个版本(Pro、Lite、Free)的状况,这里就涉及到xcode里经过添加多个targets来进行版本控制的问题了,下面就简单说明一下:

点击左侧的工程名称,右侧会出现PROJECT和TARGETS,点击你如今的target,假如叫A,右键弹出菜单中,选择Duplicate,复制一 个相同的target,复制的target通常叫A copy,A copy和A的设置(编译条件、源文件、资源文件)彻底同样,此时你能够根据须要修改A copy的编译条件和资源文件了;
一、A copy的名称是否是显得不够专业?如今来修改一下:
1)首先修改Xcode左上角的target名称:
点击xcode左上角Run、Stop右边的工程名称,下拉框中选择Manage Schemes,在弹出框中,点击A copy那行,点击一次、再点击一次,就能够修改A copy为你想要的名字了,好比ALite;
2)修改xcode左下方Products下的A copy.app名称:
点击Targets下你刚才更名后的ALite,点击Bulid Setting,搜索Packaging下的Private Headers Folder Path,修改A copy.app/PrivateHeaders为:ALite.app/PrivateHeaders;
二、修改Bundle Identifier和选择不一样的证书,让app区分开来
1)新target须要的.plist文件
新建一个文件夹X,添加X到项目中,添加时选择target为ALite,不要选target A了,由于不是共用的;复制原来target的A-Info.plist到X,修改其名称为ALite-Info.plist,xcode中右键Add File To …,选择添加到target ALite中;
2)点击target: ALite ->Summary:提示你须要选择plist文件,选择1)中添加的ALite-Info.plist;
3)点击target: ALite ->Summary:设置Bundle Idenfitier;
4)点击target: ALite->Build Settings->Code Signing:选择另外的证书;
三、修改程序名称
通常说来,多个target的程序名称不一样,复制zh-Hans.lproj和en.lproj下的InfoPlist.strings文件到 X,xcode中右键Add File To …,选择添加到target ALite中;而后修改InfoPlist.strings的内容:CFBundleDisplayName=”程序名称Lite”;
四、2个target到如今就建立好了,你添加资源文件的时候,经过选择添加的target来控制不一样版本的内容;再说一下预编译宏的事 情:target->Build Setting,搜索:Preprocessor Macros,设置Debug和Release里的预编译宏内容,好比TARGET_VERSION_LITE=1表示lite版本(注意=先后不能右空 格,有空格会编译不过),程序中对不一样版本这样判断:
#if TARGET_VERSION_LITE ==1

#elif TARGET_VERSION_LITE ==2

#endif

--源文:https://developer.apple.com/library/ios/featuredarticles/XcodeConcepts/Concept-Targets.html

------------------Target------------------

           一个Target肯定了一个product to build,包括一些instruction(怎么从一个project或者workspace的一堆文件导出一个产品)。一个Target对应一个 product,它管理着一个product的build system的“输入”(一堆源文件和一些处理这些源文件的instruction)。一个project能够包含多个target,每个targe生 成一个product。

            构建一个product的instruction表现形式是build settings and build phases(能够在Xcode Project  editor里面查看、编辑)。一个Target的build settings 继承project的build settings,可是重写覆盖project setting。同一时间里只有一个active Target ,由Xcode Scheme指定。

  一 个Target和它的product能够和其余Target联系,若是一个target build须要另外一个target的“输出”,能够说成第一个target依赖第二个。若是这俩个target在同一个workspace,Xcode会 发现他们的依赖关系,从而build the products按照特定的顺序。这样的关系被称为“ implicit dependency.” 你也能够为俩个targets指定明确的target 依赖关系在build setting里面。例如,你可能build一个library和一个连接这个library的application(同一个workspace)。 Xcode能够发现这种关系而且自动build这个library first。然而,你若是要去连接library的某个版本而不是one built in the workspace,你能够在build settings里建立一个肯定的依赖关系,它将会覆盖implicit dependency。

------------------Project------------------

         一个project是全部文件、资源、信息/配置的repository。一个project包含全部build your products所需的内容而且维护他们之间关系。它能够包含多个targets。一个project为全部的target定义默认的build setting(每个target能够自定义它们的build setting,这些自定义的setting会覆盖project默认的build setting)。 

         一个project包含以下信息:

--相关源文件:1. 源代码,.h和.m;  2. library和frameworks(内部和外部) 3. 资源文件   4.IB 文件

--在structure navigator组织source files的Groups;

--Project-level  build configuration,能够有多个,例如debug和release buid setting;

--Target:即,相应的products、source files、build configuration(包括dependencies on other targets and other setting,project-level setting会被用到当 targets’ build configurations do not override them);

--用来debug和test程序的可执行环境,包括:What executable to launch when you run or debug from Xcode;命令行参数to be passed to the executable, if any;Environmental variables to be set when the program runs, if any。

          一个project能够单独存在,也能够包含在一个workspace里。

         使用Xcode scheme去指定哪一个target,building configuration,executable configuration是active(当前)的。

------------------Build Setting------------------

         a build Setting是一个变量,包含着怎么build product的处理信息。例如,Xcode传给编译器的选项。   

         build settings有project level和target level俩中级别。project-level中的build setting适用项目中全部的targets,只要该build setting没有被相应的target重写。

         每个target管理着build one product的source files。一个build 设置包含一系列build 特定product 的build settings。例如,一般有debug  和release俩中分开的build 设置。

         一个build setting在Xcode中的包含俩部分:setting title 和 definition。前者标示着该build setting而且可被用在其余的settings。后者是一个常量或者一个表达式,肯定了build setting的值。一个build setting可能也有一个显示名称,在Xcode界面中显示build setting。

         另外,当你选择某个project template建立一个新的project,default build setting也相应的由Xcode生成了,你也能够为project或者某个target建立自定义build settings。一个conditional build setting的值取决于它的先决条件有没有被知足。这种机制容许你,例如,根据targeted architecture肯定build a product的sdk。

------------------Workspace------------------

------Workspaces Extend the Scope of Your Workflow

           一个workspace是一个Xcode 文档,groups(组合)不一样的project、文档,因此你能够同时管理多个project。一个workspace能够包含任意个Xcode project和别的文件。另外它管理着全部的文件,project和targets在一个workspace中能够有implicit和 explicit 俩种relationships。

           一个工程文件(project fiel)包含着指向project中其余全部文件、building configuration、其余project信息的指针。在Xcode 3之前,工程文件是root of the group 和file structure hierarchy。尽管一个project能够和其余project联系,可是相关项目一块儿工做还会比较困难。大部分的工做都是局限在一个 project中。在Xcode 4之后,你能够建立一个workspace去包含多个project及相关文件。

           另外提供对每一个project全部文件的访问,workspace拓展了许多Xcode workflows工做范围。例如,because indexing在整个workspace里面作索引,code completion、Jump to Definition以及一些其余功能都是针对着整个workspace。由于refactoring operations在整个workspace工做,你能够refactor API在一个framework project,而且在其余的application projects用它的framework in one operation。当building时候,一个project能够适用workspace中其余project的products。

            workspace document包含着指向included projects 和其余files的指针,可是没有其余数据。一个project能够属于多个workspace。下图显示一个workspace包含俩个Xcode project (添加的.xcodeproj到workspace)加上一个document project(添加的文件夹到workspace)。

备注:workspace相似.xcodeproj文件,他不是一个文件夹,而是一个有管理、索引做用的一个文件。


------Projects in a Workspace Share a Build Directory

          默认状况下,全部的workspace中的Xcode projects are built 在同一个目录下,简称workspace build directory。 每个workspace有 它本身的build directory。由于全部projects中的文件是同一个build directory,全部这些文件对每一个project都是可见的,因此,若是有多个project用同一个libraries,你不须要单独copy它 们到每个project文件夹中。

Xcode会 检查build directory中的文件去发现它们implicit dependencies。例如,一个workspace中的project build了一个library,这个library被workspace中另外一个project引用,Xcode会自动先build the library而后build the project,即便build configuration中没有明显的设置。若是须要的话,你能够用explicit build settings重写implicit dependencies。对于“显示依赖”(explicit dependencies),你必须建立项目引用。

          workspace中的projcet仍然保持着本身的特性。一个project是单独工做仍是跟workspace中其余project有联系工做能够经过不一样的打开方式,在workspace中打开仍是在project中打开。由于一个project属于多个workspace,你能够随意添加多个projects,而不须要从新建立project或者workspace

         你可使用workspace默认的build directory,也能够本身指定一个。请注意,若是一个project指定了一个build directory,这个目录会被它所在的workspace build directory重写,当你build the project。    

------------------Scheme------------------

          一个Xcode Scheme 定义了a collection of targets to build,a configuration to use when building, and a collection of tests to execute。

(备注:这个定义感受挺准确:A scheme is a collection of settings that specify which targets to build, what build configuration to use(not the build setting), and the executable environment to use when the product specified by the target is launched。<Scheme Configuration Help>)

          你能够有许多scheme,可是同一时间只能是激活的。你能够指定是否一个scheme存储在project里,这样每个包含他的workspace都 能看到它或者只能看某一个workspace中看到。当你选择一个激活的shceme,你也须要选择一个运行目标(设备)。

 ------------------------

ps:compile、build、execute区别:编译 + 链接/生成,目标是生成可执行Exe文件 + 执行。

相关文章
相关标签/搜索