我试图了解iOS的整个生态系统是如何运作的。 到目前为止,我可以为我的大多数问题找到答案(相信我,有很多这样的问题),但对于这个问题,似乎还没有明确的答案。
XcodeProject和XcodeWorkspace文件之间的区别是什么?
它们之间有什么不同? 他们负责什么? 当我在团队/独自开发我的应用程序时,我应该与他们中的哪一个一起工作? 关于这两个文件还有什么需要我注意的吗?
我试图了解iOS的整个生态系统是如何运作的。 到目前为止,我可以为我的大多数问题找到答案(相信我,有很多这样的问题),但对于这个问题,似乎还没有明确的答案。
XcodeProject和XcodeWorkspace文件之间的区别是什么?
它们之间有什么不同? 他们负责什么? 当我在团队/独自开发我的应用程序时,我应该与他们中的哪一个一起工作? 关于这两个文件还有什么需要我注意的吗?
工作区是项目的集合。当项目之间存在相关性时,组织项目是很有用的(例如:项目A包含一个库,它作为项目本身作为项目B提供。当您构建工作区时,项目B在项目A中被编译和链接)。 在流行的CocoaPods中使用工作区是很常见的。当你安装你的pod时,它们被放置在一个工作区中,这个工作区容纳了你的项目和pod库。
关于项目结构,我认为您需要了解三个关键事项:目标、项目和工作空间。目标详细指定了如何构建产品/二进制文件(即应用程序或库)。它们包括构建设置,例如编译器和链接器标志,并定义哪些文件(源代码和资源)实际上属于产品。在构建/运行时,总是选择一个特定的目标。
It is likely that you have a few targets that share code and resources. These different targets can be slightly different versions of an app (iPad/iPhone, different brandings,…) or test cases that naturally need to access the same source files as the app. All these related targets can be grouped in a project. While the project contains the files from all its targets, each target picks its own subset of relevant files. The same goes for build settings: You can define default project-wide settings in the project, but if one of your targets needs different settings, you can always override them there:
所有目标继承的共享项目设置,除非它们覆盖它
具体目标设置:PSE iPhone覆盖项目的Base SDK设置
在Xcode中,你总是打开项目(或工作区,但不是目标),它包含的所有目标都可以构建/运行,但没有构建项目的方法/定义,因此每个项目都需要至少一个目标,而不仅仅是文件和设置的集合。
选择一个要运行的项目目标
在很多情况下,项目就是你所需要的。如果有从源代码构建的依赖项,则可以将其嵌入子项目。子项目可以单独打开,也可以在它们的超级项目中打开。
demoLib是一个子项目
如果您将子项目的一个目标添加到超级项目的依赖项中,子项目将自动构建,除非它保持不变。这样做的好处是,你可以在同一个Xcode窗口中编辑项目和依赖项的文件,当你构建/运行时,你可以从项目及其子项目的目标中选择:
但是,如果您的库(子项目)被各种其他项目(准确地说,是它们的目标)使用,那么将其放在相同的层次结构级别上是有意义的——这就是工作空间的作用。工作区包含并管理项目,它直接包含的所有项目(即,不是它们的子项目)都在同一级别上,它们的目标可以相互依赖(项目的目标可以依赖子项目的目标,但反之则不然)。
工作空间结构
在这个例子中,两个应用程序(AnotherApplication / ProjectStructureExample)都可以引用分解项目的目标。这也可以通过将demoLib项目作为子项目包括在其他两个项目中(它只是一个引用,所以不需要重复),但是如果您有很多交叉依赖,工作区更有意义。如果您打开一个工作区,您可以在构建/运行时从所有项目的目标中进行选择。
你仍然可以单独打开你的项目文件,但它们的目标很可能不会构建,因为Xcode无法解析依赖关系,除非你打开工作空间文件。工作区给了你和子项目一样的好处:一旦依赖项发生变化,Xcode会重新构建它,以确保它是最新的(尽管我在这方面遇到过一些问题,它似乎不可靠)。
你的问题概括起来就是:
1)项目包含文件(代码/资源)、设置和从这些文件和设置构建产品的目标。工作区包含可以相互引用的项目。
2)这两个人都负责构建你的整个项目,但在不同的层面上。
3)我认为大多数情况下有项目就足够了。除非有特殊的原因,否则不要使用工作区。此外,您还可以在以后将项目嵌入到工作区中。
我认为这就是上面这篇文章的意义所在。
这里有一个注释:CocoaPods,自动为您处理第三方库,使用工作区。因此,当您使用CocoaPods(很多人都这样做)时,也必须使用它们。
在短暂的
Xcode 3引入了子项目,也就是亲子关系,父对象可以引用子对象,反之则不行 Xcode 4引入了工作区,这是兄弟关系,意味着任何项目都可以引用同一个工作区中的项目
当我使用CocoaPods开发iOS项目时,有一个.xcworkspace文件,需要用与CocoaPods相关的.xcworkspace文件打开项目。
但是当您使用.xcworkspace文件显示包内容时,您将找到内容。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
Xcode工作区vs项目
它们之间有什么不同?
工作区是一组项目
他们负责什么?
工作区负责项目之间的依赖关系。 项目源代码负责。
当我在团队/独自开发我的应用程序时,我应该与他们中的哪一个一起工作?
你的选择应该取决于你的项目类型。例如,如果你的项目依赖于CocoaPods依赖管理器,它会创建一个工作空间。
关于这两个文件还有什么需要我注意的吗?
跨项目的引用(关于)
(Xcode组件)