Xcode项目与Xcode工作区 - 差异

时间:2014-02-07 15:16:34

标签: xcode

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

XcodeProject和XcodeWorkspace文件有什么区别?

  1. 他们两个有什么区别?
  2. 他们负责什么?
  3. 当我在团队/单独开发我的应用程序时,我应该使用哪一个?
  4. 关于这两个文件,还有什么我应该注意的吗?

5 个答案:

答案 0 :(得分:526)

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

您可能有一些共享代码和资源的目标。这些不同的目标可能是稍微不同的应用程序版本(iPad / iPhone,不同的品牌......)或自然需要访问与应用程序相同的源文件的测试用例。所有这些相关目标都可以分组到项目中。当项目包含来自其所有目标的文件时,每个目标都会选择自己的相关文件子集。构建设置也是如此:您可以在项目中定义默认的项目范围设置,但如果您的某个目标需要不同的设置,您可以在那里覆盖它们:

Shared project settings that all targets inherit, unless they overwrite it

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

Concrete target settings: PSE iPhone overwrites the project’s Base SDK setting

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

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

Select one of the project’s targets to run

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

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

demoLib is a subprojec

demoLib 是一个子项目

如果将子项目的一个目标添加到超级项目的依赖项中,子项目将自动构建,除非它保持不变。这里的优点是您可以在同一个Xcode窗口中编辑项目和依赖项中的文件,在构建/运行时,您可以从项目及其子项目的目标中进行选择:

Running targets from a subproject

但是,如果您的库(子项目)被各种其他项目(或其目标,确切地说)使用,那么将它放在同一层次结构级别是有意义的 - 这就是工作区< / strong>适合。工作空间包含和管理项目,它直接包含的所有项目(即,不是它们的子项目)处于同一级别,它们的目标可以相互依赖(项目的目标可以取决于子项目的目标,但反之亦然)。

Workspace structure

工作区结构

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

Running targets from a workspace

您仍然可以单独打开项目文件,但很可能无法构建其目标,因为Xcode无法解析依赖项,除非您打开工作区文件。工作区为您提供与子项目相同的好处:一旦依赖项发生变化,Xcode将重建它以确保它是最新的(尽管我遇到了一些问题,它似乎无法可靠地工作)。

您的问题简而言之

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

2)两者都负责构建整个项目,但是在不同的层面上。

3)我认为在大多数情况下项目就足够了。除非有特殊原因,否则不要使用工作区。此外,您可以随时将项目嵌入工作区。

4)我认为这就是上面的内容......

对于3)有一句话:CocoaPods,它自动为您处理第三方库,使用工作区。因此,当您使用CocoaPods(很多人都这样做)时,您也必须使用它们。

答案 1 :(得分:96)

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

答案 2 :(得分:31)

简而言之

  • Xcode 3引入了子项目,它是父子关系,意味着父项可以引用其子目标,但反之亦然
  • Xcode 4引入了workspace,这是兄弟关系,意味着任何项目都可以在同一个工作区中引用项目

答案 3 :(得分:2)

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

enter image description here

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

enter image description here

<?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

答案 4 :(得分:0)

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

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

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

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

Xcode components