【问题标题】:What is the correct way to include Playgrounds in a Swift Package?在 Swift 包中包含 Playgrounds 的正确方法是什么?
【发布时间】:2021-08-29 09:55:04
【问题描述】:

当我发布一个 Swift 包时,我喜欢包含一些 Playgrounds 来展示如何使用该包的示例。在 Swift 5.4 之前,我能够以一种相对简单的方式做到这一点,但现在我的 Playgrounds 都没有看到我的包模块的内容。这对我来说没有任何意义。

我遵循了 Apple 自己的 WWDC 视频所展示的确切模式,即拥有一个 Playgrounds/ 文件夹作为您的 Sources/ 文件夹的对等,然后只需导入包模块。

导入有效,但 Playground 总是报告它无法从模块内部找到任何类型。它们都被标记为public,正如我之前提到的,它们过去工作得很好。

这对我在 Swift 5.45.5Xcode 12.513 Beta 中不起作用.

我认为一定有一些我不理解的设置或配置。有人可以在这里解释最佳做法吗?

作为参考,这是我的一个简单的 Swift 包,它的 Playgrounds 目前不工作: https://github.com/dunesailer/Wordsmith

编辑:它变得更加陌生。我有一个 不同 Swift 包,它的结构在我看来完全一样,但它的 Playgrounds 工作正常。什么?那个在这里: https://github.com/dunesailer/Aesthete

【问题讨论】:

  • 我注意到工作回购没有.static 库产品,但不工作的项目有。为什么在Package.swift 中使用.static?虽然看起来删除它没有帮助
  • 这不是 Xcode 中最完善的功能。这是其他人的经验,可能会有所帮助:useyourloaf.com/blog/xcode-12.5-playground-access-to-app-types
  • 是的,我担心.static 项目可能会让人们有点失去气味,但我已经测试过将其移除。如果我没记错的话,我需要它,因为包从自身加载了几个资源才能工作,而那些在没有.static 规范的情况下使用这个包的项目中不能正常工作。
  • 如果您需要更多帮助,可以去Swift forums,如果您还没有。

标签: swift xcode swift5 swift-playground swift-package-manager


【解决方案1】:

如果您在Playgrounds/ 中移动/删除文件夹Chemical NamesWork TitlesPerson Names,则所有游乐场都可以正常工作。看起来 Xcode 不支持 Playgrounds/ 中的文件夹(/这是一个错误)。

所以要解决这个问题,只需将所有 Playground 放在同一个文件夹中即可。

编辑:看起来这不一致。我已经提交了bug report/ Feedback for Developer Tools in Feedback Assistant


长期的解决方法是使用 DocC(Xcode 13 测试版中提供),它将支持 repo 中更高级的教程/文章。

【讨论】:

  • 感谢您在此处提出的可能解决方法的建议,以及您花时间尝试查看发生了什么,但我真正在寻找的是正确的“最佳实践” ,预期的方式来做到这一点。
  • 这似乎是一个错误,因此为了获得更好的体验,可能值得提交错误报告并修复它。没有解决此问题的预期/最佳实践方法。我们必须解决大量 Xcode 和 Apple 错误,当您将其与任何其他类型的开发(Android、浏览器、NodeJS、Java)进行比较时,这是非常不寻常的。
  • 我已经奖励了你,尽管我们并没有真正深入了解这一切,因为你的答案最接近我的要求,而且你花时间提交苹果的错误。
【解决方案2】:

使用工作区。

(Xcode:文件:新建:工作区)

您将它用作您的包、游乐场(或应用目标)的“容器”。重要的是使用 Xcode 左下角的“将文件添加到 ...”按钮将这些中的每一个添加到工作区,然后打开 .xcworkspace 文件:

  1. 编辑您的包
  2. 运行 Playground 文件。

您可以按照此处的说明进行操作。

https://stackoverflow.com/a/67580251/13292535

【讨论】:

  • 所以如果我使用这种方法,这意味着我不能将我的 Playgrounds 作为我的包的一部分分发。我想这只是一个预期的限制?
  • 我试过了,并没有解决问题,它显示same error in Xcode。 @Sardorbek,您应该尝试使用 Wordsmith github repo,而不仅仅是一些示例游乐场。
  • 将 Swift 包放入工作区是一件完成的事情。没有人会写一本关于它的书,但是如果你仔细阅读 Swift 论坛,你会看到 Swift 的维护者也在他们的项目中这样做。好处是将方案保存到您的工作区,而不是在每次打开xcodebuild/ xcode 时自动生成。即使您在同一目录中有xcodeproj,您也可以在您的工作区方案上运行xcodebuild(另一个错误解决方法)。 但这并不能解决您的问题。
  • 作者的问题怎么解决?我克隆了 Wordsmith 存储库,在 Package.swift 中注释了“.static”声明,然后运行“Xcode: File:Swift Packages: Reset package caches”并关闭/重新打开包。如果操场仍然没有运行,请重复几次。然后游乐场神奇地开始运行。这似乎是 Xcode 的某种错误。使用工作区:建议作为作者尝试解决问题的另一种方法。它可能会也可能不会解决他的问题,但这就是我们在这里的原因:建议,帮助找到解决方案,提供完美或不那么完美的建议。
  • 感谢你们俩的努力和讨论。你们俩都很有帮助。似乎这个问题的“正确答案”根本无法按预期工作,这就是我们陷入困境的地方!
猜你喜欢
  • 2021-03-21
  • 2019-07-28
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多