論go的測試依賴如何解決(相對/絕對路徑)/擷取真實項目根目錄
衆所周知, go的測試深受吐嘈, 整個項目運作并不會有依賴問題, 但是分開測試時, 常常會提示無法找到依賴
轉載注明:csdn連結https://blog.csdn.net/qq_35244529/article/details/114312616
-
如何簡要解決
1.經過大量測試與實驗, 目前發現通過
$GOPATH
的方式最為簡單友善, 實作如下
2.前提: 擁有
環境變量, 項目目錄在GOPATH
下,或者項目使用GOPATH
,go.mod與執行檔案同級go modules
- 測試的配置檔案讀取(源碼 gt conf_func.go)
import "github.com/dreamlu/gt/tool/file/file_func"
// dir: default is conf/
// change dir to abs /xxx/conf/
// new abs conf dir
func newConf(dir string) string {
return file_func.ProjectPath() + dir
}
- 擷取項目根目錄(源碼:gt file_func.go)
思路來源: go env 指令
原理: 借助GOPATH和GOMOD兩種方式實作項目目錄的擷取
ps: 之是以使用exec.Command(“go”, “env”, “GOMOD”), 不使用os.Getenv(“GOMOD”),感興趣的可以試試
func ProjectPath() (path string) {
// default linux/mac os
var (
sp = "/"
ss []string
)
if runtime.GOOS == "windows" {
sp = "\\"
}
// GOMOD
// in go source code:
// // Check for use of modules by 'go env GOMOD',
// // which reports a go.mod file path if modules are enabled.
// stdout, _ := exec.Command("go", "env", "GOMOD").Output()
// gomod := string(bytes.TrimSpace(stdout))
stdout, _ := exec.Command("go", "env", "GOMOD").Output()
path = string(bytes.TrimSpace(stdout))
if path != "" {
ss = strings.Split(path, sp)
ss = ss[:len(ss)-1]
path = strings.Join(ss, sp) + sp
return
}
// GOPATH
fileDir, _ := os.Getwd()
path = os.Getenv("GOPATH") // < go 1.17 use
ss = strings.Split(fileDir, path)
if path != "" {
ss2 := strings.Split(ss[1], sp)
path += sp
for i := 1; i < len(ss2); i++ {
path += ss2[i] + sp
if Exists(path) {
return path
}
}
}
return
}
-
來看上面函數作用
1.将預設依賴的配置 相對路徑
轉換成絕對路徑(結合conf/
和GOPATH
GOMOD
)
2.如過不滿足前提, 則使用預設的相對路徑
3.采用目錄遞歸和執行檔案的路徑, 一級一級的方式查找conf/
經測試, linux上, 任何路徑下的測試檔案均可以執行, 不會缺少依賴檔案
來自我的小站: https://deercoder.com/2020/05/12/go.html