我试图了解 iOS 的整个生态系统是如何运作的 .到现在为止,我可以找到大部分问题的答案(相信我,有很多问题),但对于这个问题,似乎还没有明确的答案 .
iOS
What is the difference between XcodeProject and XcodeWorkspace files?
他们两个有什么区别?
他们负责什么?
当我在团队/单独开发我的应用程序时,我应该使用哪一个?
关于这两个文件,还有什么我应该注意的吗?
我认为有关项目结构需要了解的三个关键项目:目标,项目和工作空间 . Targets 详细说明如何构建产品/二进制文件(即应用程序或库) . 它们包括构建设置,例如编译器和链接器标志,它们定义哪些文件(源代码和资源)实际属于产品 . 构建/运行时,始终选择一个特定目标 .
您可能有一些共享代码和资源的目标 . 这些不同的目标可能是稍微不同的应用程序版本(iPad / iPhone,不同的品牌......)或自然需要访问与应用程序相同的源文件的测试用例 . 所有这些相关目标都可以分组在 project 中 . 当项目包含来自其所有目标的文件时,每个目标都会选择自己的相关文件子集 . 构建设置也是如此:您可以在项目中定义默认的项目范围设置,但如果您的某个目标需要不同的设置,您可以在那里覆盖它们:
所有目标都继承的共享项目设置,除非它们覆盖它
具体目标设置:PSE iPhone会覆盖项目的 Base SDK 设置
Base SDK
在Xcode中,您总是打开项目(或工作空间,但不是目标),并且可以构建/运行它包含的所有目标,但是没有办法/定义构建项目,因此每个项目至少需要一个目标才能不仅仅是一组文件和设置 .
选择要运行的项目目标之一
在很多情况下,项目就是您所需要的 . 如果您具有从源构建的依赖项,则可以将其嵌入为 subproject . 子项目可以单独打开,也可以在超级项目中打开 .
demoLib是一个子项目
如果将子项目的一个目标添加到超级项目的依赖项中,则子项目将自动构建,除非它保持不变 . 这里的优点是您可以在同一个Xcode窗口中编辑项目和依赖项中的文件,在构建/运行时,您可以从项目及其子项目的目标中进行选择:
但是,如果您的库(子项目)被各种其他项目(或其目标,确切地说)使用,那么将它放在同一层次结构级别上是有意义的 - 这就是 workspaces 的用途 . 工作空间包含和管理项目,它直接包含的所有项目(即,不是它们的子项目)处于同一级别,它们的目标可以相互依赖(项目的目标可以取决于子项目的目标,但反之亦然) .
工作区结构
在此示例中,两个应用程序(AnotherApplication / ProjectStructureExample)都可以引用demoLib项目的目标 . 这也可以通过在其他项目中包含demoLib项目作为子项目(仅作为参考,因此不需要重复),但如果您有许多交叉依赖项,则工作区更有意义 . 如果打开工作区,则可以在构建/运行时从所有项目的目标中进行选择 .
您仍然可以单独打开项目文件,但可能无法构建其目标,因为除非打开工作区文件,否则Xcode无法解析依赖项 . 工作区为您提供与子项目相同的好处:一旦依赖项发生变化,Xcode将重建它以确保它是最新的(尽管我遇到了一些问题,但它似乎无法可靠地工作) .
Your questions in a nutshell :
1)项目包含从这些文件和设置构建产品的文件(代码/资源),设置和目标 . 工作区包含可以相互引用的项目 .
2)两者都负责构建整个项目,但在不同层面 .
3)我认为在大多数情况下项目就足够了 . 除非有特殊原因,否则不要使用工作区 . 另外,你可以随时嵌入你的稍后在工作区中投影 .
4)我认为这就是上面的内容......
对于3)有一个注释:CocoaPods,它自动为您处理第三方库,使用工作空间 . 因此,当你使用 CocoaPods (许多人这样做)时,你也必须使用它们 .
CocoaPods
工作区是项目的集合 . 它们之间的相关性(例如:项目A包括一个库,作为项目本身作为项目B提供 . 当您构建工作区时,项目B在项目A中被编译和链接) .在流行的CocoaPods中使用工作区是很常见的 . 安装pod时,它们将放置在工作区内,该工作区包含项目和pod库 .
简单来说
Xcode 3引入了子项目,它是父子关系,意味着父项可以引用其子目标,但反之则不然
Xcode 4引入了工作空间,这是兄弟关系,这意味着任何项目都可以在同一工作空间中引用项目
当我使用CocoaPods开发iOS项目时,有一个 .xcworkspace 文件,您需要使用与CocoaPods相关的 .xcworkspace 文件打开该项目 .
.xcworkspace
But when you Show Package Contents with .xcworkspace file,you will find the contents.xcworkspacedata file.
<?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"
The .xcworkspace file has reference with the .xcodeproj file.
发展环境:macOS 10.14 Xcode 10.1
macOS 10.14 Xcode 10.1
4 回答
我认为有关项目结构需要了解的三个关键项目:目标,项目和工作空间 . Targets 详细说明如何构建产品/二进制文件(即应用程序或库) . 它们包括构建设置,例如编译器和链接器标志,它们定义哪些文件(源代码和资源)实际属于产品 . 构建/运行时,始终选择一个特定目标 .
您可能有一些共享代码和资源的目标 . 这些不同的目标可能是稍微不同的应用程序版本(iPad / iPhone,不同的品牌......)或自然需要访问与应用程序相同的源文件的测试用例 . 所有这些相关目标都可以分组在 project 中 . 当项目包含来自其所有目标的文件时,每个目标都会选择自己的相关文件子集 . 构建设置也是如此:您可以在项目中定义默认的项目范围设置,但如果您的某个目标需要不同的设置,您可以在那里覆盖它们:
所有目标都继承的共享项目设置,除非它们覆盖它
具体目标设置:PSE iPhone会覆盖项目的
Base SDK
设置在Xcode中,您总是打开项目(或工作空间,但不是目标),并且可以构建/运行它包含的所有目标,但是没有办法/定义构建项目,因此每个项目至少需要一个目标才能不仅仅是一组文件和设置 .
选择要运行的项目目标之一
在很多情况下,项目就是您所需要的 . 如果您具有从源构建的依赖项,则可以将其嵌入为 subproject . 子项目可以单独打开,也可以在超级项目中打开 .
demoLib是一个子项目
如果将子项目的一个目标添加到超级项目的依赖项中,则子项目将自动构建,除非它保持不变 . 这里的优点是您可以在同一个Xcode窗口中编辑项目和依赖项中的文件,在构建/运行时,您可以从项目及其子项目的目标中进行选择:
但是,如果您的库(子项目)被各种其他项目(或其目标,确切地说)使用,那么将它放在同一层次结构级别上是有意义的 - 这就是 workspaces 的用途 . 工作空间包含和管理项目,它直接包含的所有项目(即,不是它们的子项目)处于同一级别,它们的目标可以相互依赖(项目的目标可以取决于子项目的目标,但反之亦然) .
工作区结构
在此示例中,两个应用程序(AnotherApplication / ProjectStructureExample)都可以引用demoLib项目的目标 . 这也可以通过在其他项目中包含demoLib项目作为子项目(仅作为参考,因此不需要重复),但如果您有许多交叉依赖项,则工作区更有意义 . 如果打开工作区,则可以在构建/运行时从所有项目的目标中进行选择 .
您仍然可以单独打开项目文件,但可能无法构建其目标,因为除非打开工作区文件,否则Xcode无法解析依赖项 . 工作区为您提供与子项目相同的好处:一旦依赖项发生变化,Xcode将重建它以确保它是最新的(尽管我遇到了一些问题,但它似乎无法可靠地工作) .
Your questions in a nutshell :
1)项目包含从这些文件和设置构建产品的文件(代码/资源),设置和目标 . 工作区包含可以相互引用的项目 .
2)两者都负责构建整个项目,但在不同层面 .
3)我认为在大多数情况下项目就足够了 . 除非有特殊原因,否则不要使用工作区 . 另外,你可以随时嵌入你的稍后在工作区中投影 .
4)我认为这就是上面的内容......
对于3)有一个注释:CocoaPods,它自动为您处理第三方库,使用工作空间 . 因此,当你使用
CocoaPods
(许多人这样做)时,你也必须使用它们 .工作区是项目的集合 . 它们之间的相关性(例如:项目A包括一个库,作为项目本身作为项目B提供 . 当您构建工作区时,项目B在项目A中被编译和链接) .
在流行的CocoaPods中使用工作区是很常见的 . 安装pod时,它们将放置在工作区内,该工作区包含项目和pod库 .
简单来说
Xcode 3引入了子项目,它是父子关系,意味着父项可以引用其子目标,但反之则不然
Xcode 4引入了工作空间,这是兄弟关系,这意味着任何项目都可以在同一工作空间中引用项目
当我使用CocoaPods开发iOS项目时,有一个
.xcworkspace
文件,您需要使用与CocoaPods相关的.xcworkspace
文件打开该项目 .But when you Show Package Contents with .xcworkspace file,you will find the contents.xcworkspacedata file.
<?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"
The .xcworkspace file has reference with the .xcodeproj file.
发展环境:
macOS 10.14 Xcode 10.1