Swift Package Index 的标志。Swift Package Index

追踪 Swift 6 严格并发检查在数据竞争安全方面的采用情况。有多少包已为 Swift 6 做好准备

使用 SPI Playgrounds 应用程序提交更好的错误报告


我们最近发布了 SPI Playgrounds 应用程序,它允许您在 Xcode 的 Playground 中试用 Swift 包。在评估依赖项时,您可以使用它来快速启动并运行新包。但是,当您处理项目中已经使用的依赖项时,它也可能很有用。其中一个用例是创建可重现的错误报告。

当人们报告问题时,开源维护者通常很难提供帮助,尤其是在大型应用程序中,重现错误可能需要大量的设置。对于服务器端的 Swift 项目来说,这尤其具有挑战性,因为您可能具有数据库和其他服务等依赖项。

为了帮助开源维护者帮助您,准备一些他们可以独立运行的东西可能很有用。在 playground 中怎么样?没有比这更简单的了!

最近,在查看 Swift Package Index 中的一个问题时,结果证明这是使用 Arena 创建一个 playground 的绝佳机会,我们可以在其中重现该问题。

注意: Arena 是 SPI Playgrounds 应用程序中使用的底层工具。可以将其视为该应用程序的命令行版本。我们在此处使用它,因为它允许您创建一个嵌入多个依赖项的 Playground,而 SPI Playgrounds 应用程序尚不支持这一点。

我们首先按如下方式运行 Arena

arena https://github.com/vapor/vapor https://github.com/vapor/fluent https://github.com/vapor/fluent-postgres-driver -o ssl-error-repro

此命令生成了一个 playground,其中导入了 Vapor、Fluent 和 Postgres 驱动程序。我们知道该问题发生在通过 TLS 访问 Azure Postgres 数据库时,因此我们设置了一个包含单个记录的测试数据库,并通过 Fluent 读取了该记录。

重现该错误的整个代码片段大约 30 行

import Vapor
import Fluent
import FluentPostgresDriver

final class Test: Model, Content {
    static let schema = "test"

    @ID(key: .id)
    var id: UUID?
}

func run() throws {
    let app = Application(.testing)
    defer { app.shutdown() }

    let tlsConfig: TLSConfiguration = .forClient()
    app.databases.use(.postgres(hostname: "pgnio-debug.postgres.database.azure.com",
                                port: 5432,
                                username: "test@pgnio-debug",
                                password: "<ask me for the password>",
                                database: "test",
                                tlsConfiguration: tlsConfig), as: .psql)

    let db = app.db

    let t = try Test.find(UUID("cafecafe-cafe-cafe-cafe-cafecafecafe"), on: db).wait()
    print("t: \(String(describing:  t))")
}

run()

最后,为该问题设置新的测试数据库花费了更多时间。更重要的是,从那时起,按照指示迭代和尝试更多操作变得非常容易。远比它仍然是 Swift Package Index 服务器项目的一部分容易得多。

在某种程度上,创建这个 playground 帮助修复了这个错误。如果我们没有花时间以独立的方式重现该问题,维护人员将很难确定这是一个他们可以解决的问题。

再次感谢 Fabian FettGwynne RaskindJohannes Weiss 的帮助,并感谢 Fabian 快速解决问题,我们希望这篇文章也能帮助您提交更好的错误报告!


关于此博客

Swift Package Index 是 Swift 包的搜索引擎和元数据索引。我们的主要目标是帮助您更好地决定在您的应用程序和项目中包含哪些依赖项。如果您是新来的,最好的入门方式是搜索包