运行 SPM 包中的 SwiftUI 预览

Run SwiftUI preview from SPM Package

我正在开发 Swift 包管理器包,其中需要包含 SwiftUI 视图。

每个 SwiftUI 视图都应该有预览。

但是,当我尝试 运行 预览任何视图时,出现以下错误:

我找到了一种方法,如果我将包方案更改为主要目标方案,它就会起作用。但是使用这种方式我必须一直在方案之间切换,每次我想 运行 预览包时都需要构建主要目标。

是否可以 运行 SwiftUI 以某种方式直接从 SPM 包预览而不构建主要目标?

Xcode 12

有了 Xcode 12,SwiftUI 预览就可以在独立包 'as-should' 中运行

Xcode 11+

Is it possible to run SwiftUI preview somehow directly from SPM Package without building the main target?

不,至少到现在为止(Xcode 11.4beta3)。 Preview 是 Simulator 的变体,它需要 UI 可执行文件来为您的视图预览设置全功能 运行-time 上下文。

解决方案(来自实践):设置 SwiftUI 可执行目标,并行包含包中的所有文件(或包本身,取决于)并执行所有 SwiftUI 开发,但包本身在持续集成过程中构建(包括单元测试)。

在 Xcode 12 中已更改。在 Swift 个包中启用了预览 。事实上,添加了许多更改和新功能,改善了 SwiftUI 库扩展的用户和开发人员体验。您可以观看 this WWDC20 session 以了解更多信息。

要使其在 Xcode 12 的第一个测试版中运行,您必须创建一个库 Swift 包。确保您的程序可以构建 - 并且 SwiftUI 已导入。此外,请记住添加包清单中支持的平台 - SwiftUI 和您的包代码支持的平台。在方案 select 或 select 中,您要预览的库和您的库支持的设备。之后启用 canvas 预览应该是可见的。目前有一些粗糙的角落,但我希望错误和可用性会在以后的版本中得到改善。

您需要在 swiftpackage 声明中添加一个平台目标,例如 iOS 请参见下面的示例(使用 iOS(.v13)) :

let package = Package(
    name: "NAME",
    platforms: [.iOS(.v13)],
    products: [
        // Products 
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
    ],
    targets: [
        // Targets
        // Test Targets
    ]
)

现在,请确保您使用相同的目标进行预览。你当然可以添加更多。