Answers:
我认为关于项目结构,您需要了解三个关键项目:目标,项目和工作区。目标详细说明如何构建产品/二进制文件(即应用程序或库)。它们包括构建设置,例如编译器和链接器标志,并且它们定义哪些文件(源代码和资源)实际上属于产品。构建/运行时,始终选择一个特定目标。
您可能有几个共享代码和资源的目标。这些不同的目标可能是应用程序的稍有不同的版本(iPad / iPhone,不同的品牌……)或测试用例,这些测试用例自然需要访问与该应用程序相同的源文件。所有这些相关目标都可以归为一个项目。当项目包含来自其所有目标的文件时,每个目标都选择自己的相关文件子集。构建设置也是如此:您可以在项目中定义默认的整个项目范围的设置,但是如果您的目标之一需要不同的设置,则可以始终在其中进行覆盖:
所有目标都继承的共享项目设置,除非它们覆盖了它们
具体的目标设置:PSE iPhone会覆盖项目的Base SDK
设置
在Xcode中,您总是打开项目(或工作空间,但不打开目标),并且可以构建/运行它包含的所有目标,但是无法/不能定义一个项目的构建,因此每个项目至少需要一个目标才能不仅仅是文件和设置的集合。
选择要运行的项目目标之一
在很多情况下,项目就是您所需要的。如果您有从源构建的依赖项,则可以将其作为子项目嵌入。子项目可以单独打开,也可以在其超级项目中打开。
demoLib是一个子项目
如果将子项目的目标之一添加到超级项目的依赖项中,除非子项目保持不变,否则将自动构建子项目。这样做的好处是,您可以在同一Xcode窗口中编辑项目和依赖项中的文件,并且在生成/运行时,可以从项目及其子项目的目标中进行选择:
但是,如果您的库(子项目)被其他许多项目(或更确切地说是其目标)使用,则将其置于相同的层次结构级别是有意义的-这就是工作空间的用途。工作区包含并管理项目,并且直接包含的所有项目(即不是其子项目)都处于同一级别,并且它们的目标可以相互依赖(项目的目标可以取决于子项目的目标,反之则不行)。
工作空间结构
在此示例中,两个应用程序(AnotherApplication / ProjectStructureExample)都可以引用demoLib项目的目标。通过将demoLib项目作为子项目包含在其他两个项目中,这也是有可能的(这只是参考,因此无需重复),但是如果您有很多交叉依赖项,则工作空间更有意义。如果打开工作空间,则在构建/运行时可以从所有项目的目标中进行选择。
您仍然可以单独打开项目文件,但是很有可能无法建立它们的目标,因为Xcode无法解析依赖关系,除非您打开工作区文件。工作区为您带来与子项目相同的好处:依赖项更改后,Xcode将重新构建它以确保它是最新的(尽管我遇到了一些问题,但它似乎无法可靠地工作)。
简而言之,您的问题是:
1)项目包含文件(代码/资源),设置和从这些文件和设置构建产品的目标。工作区包含可以相互引用的项目。
2)两者都负责构建整个项目,但层次不同。
3)我认为在大多数情况下项目就足够了。除非有特殊原因,否则不要使用工作空间。另外,您以后总是可以将项目嵌入工作空间中。
4)我认为以上是针对…的内容。
这里有3条评论:CocoaPods自动为您处理第三者库,使用工作区。因此,您在使用时也必须使用它们CocoaPods
(很多人都这样做)。
工作区是项目的集合。在项目之间存在关联时组织项目很有用(例如:项目A包含一个库,该库作为项目本身作为项目B提供。在构建工作空间时,项目B在项目A中被编译和链接)。
在流行的CocoaPods中使用工作区是很常见的。安装Pod时,它们会放置在一个工作区中,该工作区用于保存项目和Pod库。
当我使用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