swift Xcode 12、工作区和新的“XCFrameworks”无法配合使用

3zwtqj6y  于 2022-11-21  发布在  Swift
关注(0)|答案(1)|浏览(247)

我有一个项目,由多个较小的项目组成。我通常通过Carthage来管理这个混乱的项目,但对于开发,我使用xcworkspace来更容易和更快地进行更改,并使用Xcode通过工作区来构建子项目和主项目。
我最近开始更新所有项目,以使用新的XCFrameworks(而不是Carthage/Xcode用来生成的“胖框架”)。
如果我只是在根项目(xcproject)上工作,并直接链接XCFrameworks,那么一切都正常。

Multiple commands produce '/Users/.../Library/Developer/Xcode/DerivedData/gnuwolzggqlzhlfiipjzbigitmvu/Build/Products/Debug-iphoneos/....framework':
1) Command: ProcessXCFramework /Users/.../Development/.../.../Carthage/Build/....xcframework /Users/.../Library/Developer/Xcode/DerivedData/gnuwolzggqlzhlfiipjzbigitmvu/Build/Products/Debug-iphoneos/....framework ios
2) Command: ProcessXCFramework /Users/shanew/Development/.../Libraries/.../Carthage/Build/....xcframework /Users/.../Library/Developer/Xcode/DerivedData/gnuwolzggqlzhlfiipjzbigitmvu/Build/Products/Debug-iphoneos/....framework ios

子项目框架没有嵌入它们的依赖项(好像我记得,这导致了其他问题),依赖项管理是通过Carthage管理的,所以根项目和子项目将共享依赖项,我认为这是问题的原因。
我有一些“小”运气,如果我先构建子项目,然后删除它的“框架、库和嵌入式内容”,我可以让根项目工作,但当我试图用多个子项目这样做时,我开始遇到问题。
我确实注意到,当我删除xcframeworks并用项目替换它时,它会用“胖框架”图标显示项目,而不是xcframeworks图标...我怀疑这部分问题,但我想我会提到它...

所以问题是...
我们如何将“子项目”/“框架”包含到xcworkspace中,这些子项目/框架具有xcframeworks依赖项(与其他项目共享),并在构建时不触发“Multiple commands produce... output”错误。

yeotifhr

yeotifhr1#

不确定这完全Map到OP场景,但这里是为我们工作的。
使用.framework的初始工作设置:

  • 工作区
  • 框架项目
  • 取决于第三方框架ZZZ,通过Carthage
  • 有自己的Carthage cartfile和Carthage目录
  • 链接到Carthage\Build中的ZZZ .framework二进制文件
  • 申请项目
  • 通过Xcode目标依赖性依赖于Framework
  • 取决于第三方框架ZZZ,通过Carthage
  • 有自己的Carthage cartfile和Carthage目录
  • 嵌入并链接到来自Carthage\Build的ZZZ .framework二进制文件

然后我们将第三方依赖ZZZ移到XCFramework,仍然通过Carthage,同样的设置不再起作用。我们的框架构建得很好,但是构建我们的应用程序失败了,因为有多个命令试图生成ZZZ。
最后,对我们起作用的是修改Application项目和它包含第三方框架ZZZ的方式。Application项目嵌入并链接了取自Framework Carthage\Build目录的 * 相同 * 二进制文件,而不是拥有自己的Carthage管理的依赖项、构建目录、构建的二进制文件等。
因此,设置如下:

  • 工作区
  • 框架项目
  • 取决于第三方框架ZZZ,通过Carthage
  • 有自己的Carthage cartfile和Carthage目录
  • 链接到Carthage\Build中的ZZZ XCFramework二进制文件
  • 申请项目
  • 通过Xcode目标依赖性依赖于Framework
    *是否通过Carthage明确**依赖于第三方框架ZZZ
    *没有自己的Carthage cartfile和Carthage目录
  • (或者第三方框架未在此处列出)
  • 嵌入并链接到Framework\Carthage\Build中的ZZZ XCFramework二进制文件

希望你说的有道理。
当一个应用程序项目不是通过Xcode目标依赖性,而是通过复制到某个地方的原始XCFramework文件依赖于我们的框架时,情况就不同了。在这种情况下,应用程序项目必须再次通过Carthage显式地依赖于第三方框架ZZZ,并从它自己的Carthage\Build目录中嵌入/链接XCFramework二进制文件。

相关问题