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

jcm*_*ner 6 go

我有一些Go测试依赖于一些外部代码,这些代码具有注册mysql驱动程序的init()方法.我的代码也需要注册mysql驱动程序,因此我在运行测试时遇到了恐慌和错误"注册为驱动程序mysql调用了两次".

似乎我依赖的repo有一个vendor目录,里面有驱动程序("vendors/github.com/go-sql-driver/mysql").似乎当我运行我的测试时,驱动程序中的init()方法被调用并注册导致冲突的mysql驱动程序.

我能看到的最佳选择是将依赖项复制到我自己的供应商目录,并从依赖项的供应商目录中删除mysql驱动程序.但是我并不热衷于此,因为它涉及复制我的依赖关系,然后通过删除文件来修改它.另外,我只是依赖它来运行测试,所以我不确定我是否应该以任何方式将它移动到我的供应商目录.

有没有办法阻止在依赖项的供应商依赖项上调用init()?

Ain*_*r-G 1

首先,我会放弃这种依赖。如果它正在注册数据库驱动程序(依赖项确实不应该这样做),我预测它会出现更多问题。我也建议打开一个问题。

作为解决方法,您可以根据您是否处于测试构建中来导入库。所以你将有一个名为eg的文件,mysqlimport.go除了

// +build !test

import _ "github.com/go-sql-driver/mysql"
Run Code Online (Sandbox Code Playgroud)

这样,只有在您不进行测试时才会调用此代码。尽管您必须使用 开始测试go test -tags test