Xcode项目与Xcode工作区-差异


401

我试图了解整个生态系统是如何iOS工作的。
到目前为止,我可以为我的大部分问题找到答案(并且相信我,有很多问题),但是对于这个问题,似乎还没有明确的答案。

XcodeProject和XcodeWorkspace文件有什么区别?

  1. 两者之间有什么区别?
  2. 他们负责什么?
  3. 当我以团队/单独方式开发我的应用程序时,应该与哪一个合作?
  4. 关于这两个文件,我还有什么要注意的吗?

Answers:


606

我认为关于项目结构,您需要了解三个关键项目:目标项目工作区目标详细说明如何构建产品/二进制文件(即应用程序或库)。它们包括构建设置,例如编译器和链接器标志,并且它们定义哪些文件(源代码和资源)实际上属于产品。构建/运行时,始终选择一个特定目标。

您可能有几个共享代码和资源的目标。这些不同的目标可能是应用程序的稍有不同的版本(iPad / iPhone,不同的品牌……)或测试用例,这些测试用例自然需要访问与该应用程序相同的源文件。所有这些相关目标都可以归为一个项目。当项目包含来自其所有目标的文件时,每个目标都选择自己的相关文件子集。构建设置也是如此:您可以在项目中定义默认的整个项目范围的设置,但是如果您的目标之一需要不同的设置,则可以始终在其中进行覆盖:

所有目标都继承的共享项目设置,除非它们覆盖了它们

所有目标都继承的共享项目设置,除非它们覆盖了它们

具体的目标设置:PSE iPhone会覆盖项目的基本SDK设置

具体的目标设置:PSE iPhone会覆盖项目的Base SDK设置

在Xcode中,您总是打开项目(或工作空间,但不打开目标),并且可以构建/运行它包含的所有目标,但是无法/不能定义一个项目的构建,因此每个项目至少需要一个目标才能不仅仅是文件和设置的集合。

选择要运行的项目目标之一

选择要运行的项目目标之一

在很多情况下,项目就是您所需要的。如果您有从源构建的依赖项,则可以将其作为子项目嵌入。子项目可以单独打开,也可以在其超级项目中打开。

demoLib是一个子项目

demoLib是一个子项目

如果将子项目的目标之一添加到超级项目的依赖项中,除非子项目保持不变,否则将自动构建子项目。这样做的好处是,您可以在同一Xcode窗口中编辑项目和依赖项中的文件,并且在生成/运行时,可以从项目及其子项目的目标中进行选择:

从子项目中运行目标

但是,如果您的库(子项目)被其他许多项目(或更确切地说是其目标)使用,则将其置于相同的层次结构级别是有意义的-这就是工作空间的用途。工作区包含并管理项目,并且直接包含的所有项目(即不是其子项目)都处于同一级别,并且它们的目标可以相互依赖(项目的目标可以取决于子项目的目标,反之则不行)。

工作空间结构

工作空间结构

在此示例中,两个应用程序(AnotherApplication / ProjectStructureExample)都可以引用demoLib项目的目标。通过将demoLib项目作为子项目包含在其他两个项目中,这也是有可能的(这只是参考,因此无需重复),但是如果您有很多交叉依赖项,则工作空间更有意义。如果打开工作空间,则在构建/运行时可以从所有项目的目标中进行选择。

从工作空间运行目标

您仍然可以单独打开项目文件,但是很有可能无法建立它们的目标,因为Xcode无法解析依赖关系,除非您打开工作区文件。工作区为您带来与子项目相同的好处:依赖项更改后,Xcode将重新构建它以确保它是最新的(尽管我遇到了一些问题,但它似乎无法可靠地工作)。

简而言之,您的问题是

1)项目包含文件(代码/资源),设置和从这些文件和设置构建产品的目标。工作区包含可以相互引用的项目。

2)两者都负责构建整个项目,但层次不同。

3)我认为在大多数情况下项目就足够了。除非有特殊原因,否则不要使用工作空间。另外,您以后总是可以将项目嵌入工作空间中。

4)我认为以上是针对…的内容。

这里有3条评论:CocoaPods自动为您处理第三者库,使用工作区。因此,您在使用时也必须使用它们CocoaPods(很多人都这样做)。


7
一个项目可以属于两个单独的工作区吗?或者,如果我想与其他两个人共享一个项目,它们是否需要全部都属于同一工作区?
杰克

8
绝对地,一个项目可以是您想要的许多工作空间的一部分。将项目添加到工作区不会更改项目本身。因此,您有许多选择...全部集中在一个工作空间,两个共享一个项目的工作空间,或两个共享项目作为子项目的项目中。
hagi

1
我对此没有任何经验,但是自述文件中说:“ 您保留对项目结构和设置的完全控制 ”,并且“ 而不是将[依赖项]集成到单个工作区中,[...]他们自己的Xcode项目 ”。简而言之:它根本不涉及您的项目/工作区,因此我看不出应如何将其包括在答案中。如果您使用Carthage,答案仍然很有用,特别是因为必须决定如何构造依赖项时,但这些都不是Carthage特有的。
hagi

关于项目层次结构的详细解释。如果我从该位置删除/移动子项目,那么该子项目将保留在主项目中?stackoverflow.com/questions/40214505/...
加尼甚Guturi

父项目文件具有对子项目的引用,而不是副本。如果子项目被删除,则父级将不再找到它。通常,您要确保在文件系统级别上,父项目具有其所有子项目的本地副本。依赖管理器(例如CocoaPods或Carthage)将为您完成此工作,或者您可以使用git子模块。
gi

102

工作区是项目的集合。在项目之间存在关联时组织项目很有用(例如:项目A包含一个库,该库作为项目本身作为项目B提供。在构建工作空间时,项目B在项目A中被编译和链接)。
在流行的CocoaPods中使用工作区是很常见的。安装Pod时,它们会放置在一个工作区中,该工作区用于保存项目和Pod库。


34

简单来说

  • Xcode 3引入了子项目,这是父子关系,这意味着父项可以引用其子目标,反之亦然
  • Xcode 4引入了工作空间,这是同级关系,这意味着任何项目都可以引用同一工作空间中的项目

2

当我使用CocoaPods开发iOS项目时,有一个.xcworkspace文件,您需要使用.xcworkspace与CocoaPods相关的文件打开该项目。

文件预览

但是当您Show Package Contents使用.xcworkspace文件时,您会找到contents.xcworkspacedata文件。

包装内容

<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "group:BluetoothColorLamp24G.xcodeproj">
   </FileRef>
   <FileRef
      location = "group:Pods/Pods.xcodeproj">
   </FileRef>
</Workspace>

注意这一行:

location = "group:BluetoothColorLamp24G.xcodeproj"

.xcworkspace文件具有对该文件的引用.xcodeproj

开发环境:

macOS 10.14
Xcode 10.1

2
  1. 两者之间有什么区别?
    工作区是一组项目

  2. 他们负责什么?
    项目负责源代码。工作区负责项目之间的依赖关系

  3. 当我以团队/单独方式开发我的应用程序时,应该与哪一个合作?
    您的选择应取决于项目的类型。例如,如果您的项目依赖于CocoaPods依赖项管理器,则会创建一个工作区。

  4. 关于这两个文件,我还有什么要注意的吗?
    工作区的竞争对手是cross-project references[关于]

[Xcode组件]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.