我们最近发布了 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 Fett、Gwynne Raskind 和 Johannes Weiss 的帮助,并感谢 Fabian 快速解决问题,我们希望这篇文章也能帮助您提交更好的错误报告!