您的位置:首页 > 产品设计 > UI/UE

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

2015-11-08 12:20 477 查看
一:Xcode 环境简介

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

Workspace:

简单来说,Workspace就是一个容器,在该容器中可以存放多个你创建的Xcode Project, 以及其他的项目中需要使用到的文件。

使用Workspace的好处有:

1),扩展项目的可视域,即可以在多个项目之间跳转,重构,一个项目可以使用另一个项目的输 出。Workspace会负责各个Project之间提供各种相互依赖的关系;

2),多个项目之间共享Build目录。

Project:

指一个项目,该项目会负责管理生成一个或者多个软件产品的全部文件和配置,一个Project可以包含多个Target。

Target:

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

Scheme:

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

BuildSetting:

配置产品的Build设置,比方说,使用哪个Architectures?使用哪个版本的SDK?。在Xcode
Project中,有Project级别的Build Setting,也有Target级别的Build
Setting。Build一个产品时一定是针对某个Target的,因此,XCode中总是优先选择Target的Build
Setting,如果Target没有配置,则会使用Project的Build Setting。

关于如何构建以上环境,请参考devCenter官方指南:
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和示例,方面别人在使用的时候查看和借鉴。

具体步骤:

1、创建BaseApp工程,注意这里被依赖的工程要是Static Library。

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

行成如上图所示的依赖关系。

3、这样BaseAppSample里面就可以使用BaseApp里面的类了么?开始我以为可以了,可是我错了。在BaseAppSample里面import相关的类会出现找不到的error,会编译错误。需要进行下面的操作:

在Header Search Paths 里面添加引入头文件的路径,如上所示,这样就不会出现编译的error了。

4、等等,好像以为正确,comand + r。Oh,NO,还是有错误。还是编译还出现找不到相关的文件。

这个时候可以判断的是,编译的结果没有能够正确的依赖,进行下面的步骤

添加target的依赖关系,保证编译BaseAppSample的时候先编译BaseApp。

选中BaseAppSample Target,然后选中其Build phases选项,添加BaseApp target

然后把lib也引入依赖中,如下所示:

5、如果被依赖包(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的编译条件和资源文件了;

1、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;

2、修改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:选择另外的证书;

3、修改程序名称

一般说来,多个target的程序名称不同,复制zh-Hans.lproj和en.lproj下的InfoPlist.strings文件到
X,xcode中右键Add File To …,选择添加到target
ALite中;然后修改InfoPlist.strings的内容:CFBundleDisplayName=”程序名称Lite”;

4、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文件 + 执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: