我有一些 Go 测试依赖于一些外部代码,这些代码具有注册 mysql 驱动程序的 init() 方法。我的代码还需要注册 mysql 驱动程序,因此我在运行测试时遇到了 panic 和错误“Register called twice for driver mysql”。
我所依赖的 repo 似乎有一个 vendors 目录,其中包含驱动程序(“vendors/github.com/go-sql-driver/mysql”)。似乎当我运行我的测试时,驱动程序中的 init() 方法被调用并注册了导致冲突的 mysql 驱动程序。
我能看到的最佳选择是将依赖项复制到我自己的 vendor 目录,并从依赖项的 vendor 目录中删除 mysql 驱动程序。但是我并不热衷于此,因为它涉及复制我的依赖项,然后通过删除文件来修改它。另外,我只依赖它来运行测试,所以我不确定是否应该以任何方式将它移动到我的 vendor 目录。
有没有办法阻止 init() 在依赖项的 vendor 依赖项上被调用?
最佳答案
首先,我会放弃依赖。如果它正在注册一个数据库驱动程序——依赖项真的不应该做——我预测它会有更多的问题。我也建议打开一个问题。
作为解决方法,您可以根据您是否处于测试构建中来导入库。因此,您将拥有一个名为 e.g. 的文件。 mysqlimport.go
什么都没有
// +build !test
import _ "github.com/go-sql-driver/mysql"
这样,只有在您不进行测试时才会调用此代码。尽管您必须使用 go test -tags test
开始测试。
关于Golang 依赖项在 init() 中注册 sql 驱动程序导致冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45589270/