ChatGPT解决这个技术问题 Extra ChatGPT

Xcode 项目与 Xcode 工作区 - 差异

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

XcodeProject 和 XcodeWorkspace 文件有什么区别?

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


S
Stoyan

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

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

https://i.stack.imgur.com/WToPC.png

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

https://i.stack.imgur.com/UA3TA.png

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

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

https://i.stack.imgur.com/guLvo.png

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

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

https://i.stack.imgur.com/g3mpl.png

demoLib 是一个子项目

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

https://i.stack.imgur.com/sV41Z.png

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

https://i.stack.imgur.com/1ug5Z.png

工作区结构

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

https://i.stack.imgur.com/LtHRd.png

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

简而言之,您的问题:

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

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

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

4)我认为这就是上面的文字的目的......

3) 有一个注释:CocoaPods 会自动为您处理 3rd 方库,它使用工作区。因此,当您使用 CocoaPods(很多人都这样做)时,您也必须使用它们。


一个项目可以成为两个独立工作区的一部分吗?或者,如果我想与另外两个共享一个项目,他们是否需要都属于同一个工作区?
当然,一个项目可以是任意数量的工作空间的一部分。将项目添加到工作区不会改变项目本身的任何内容。因此,您有很多选择……都在一个工作区中,两个工作区共享一个项目,或者两个项目将共享项目作为子项目。
我对此没有任何经验,但 README 说:“您保留对项目结构和设置的完全控制权”和“而不是将 [依赖项] 集成到单个工作区,[...] 您的依赖项必须包含它们自己的 Xcode 项目”。简而言之:它根本不会触及您的项目/工作区,所以我看不出我应该如何将它包含在答案中。如果您使用 Carthage,答案仍然很有帮助,尤其是当 必须决定如何构建您的依赖项时,但这些都不是 Carthage 特有的。
很好地解释了项目层次结构。如果我从该位置删除/移动子项目,那么子项目将保留在主项目中吗? stackoverflow.com/questions/40214505/…
父项目文件有对子项目的引用,而不是副本。如果子项目被删除,父项目将不再找到它。通常,您希望在文件系统级别确保父项目具有其所有子项目的本地副本。诸如 CocoaPods 或 Carthage 之类的依赖管理器会为你做这件事,或者你可以使用 git 子模块。
a
andreamazz

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


o
onmyway133

简单来说

Xcode 3引入了subproject,即父子关系,即parent可以引用其child target,反之则不行

Xcode 4引入了workspace,是兄弟关系,意味着任何项目都可以引用同一个workspace中的项目


y
yoAlex5

Xcode 工作区与项目

他们两个有什么区别?

Workspace 是一组项目

他们负责什么?

Workspace 负责项目之间的依赖关系。 Project 负责源代码。

当我在团队/单独开发我的应用程序时,我应该使用其中哪一个?

您的选择应该取决于您的项目类型。例如,如果您的项目依赖于 CocoaPods 依赖管理器,它会创建一个工作区。

关于这两个文件,我还有什么需要注意的吗?

cross-project references[About]

[Xcode components]


J
Jack T

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

https://i.stack.imgur.com/ZPcGA.png

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

https://i.stack.imgur.com/6b5LA.png

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