Golang 依赖项在 init() 中注册 sql 驱动程序导致冲突

标签 go

我有一些 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/

相关文章:

go - 如何从平衡器获取 gPRC 调用状态

go - 如何停止 io.CopyN

c - 不在 cgo 中显示 printf 结果

html-parsing - 使用 Go lang 从网页中提取链接

database - Golang(带 gocql 驱动程序)不返回 Cassandra DB 中的所有条目

memory - 如何让我的服务器(用 Golang 编写)不会耗尽内存?

interface - Go 中 "interface {}"语法的作用是什么?

dictionary - 如何使用 Go 修复 Struct 中的问题?

go - 在哪里存储测试(项目结构-最佳实践)?

c - 如何让cgo返回数组给c?