beego項目新增一個api的校驗功能結果運行導致panic
/var/folders/3p/jc3w8_dn5dd0r5_5ccp3nrqm0000gn/T/go-build935260114/b001/exe/main flag redefined: graceful panic: /var/folders/3p/jc3w8_dn5dd0r5_5ccp3nrqm0000gn/T/go-build935260114/b001/exe/main flag redefined: graceful goroutine 1 [running]: flag.(*FlagSet).Var(0xc0000862a0, 0x18aaa20, 0x1d40069, 0x17b06d5, 0x8, 0x17c3eac, 0x21) /usr/local/Cellar/go/1.13.8/libexec/src/flag/flag.go:848 +0x4ae flag.BoolVar(...) /usr/local/Cellar/go/1.13.8/libexec/src/flag/flag.go:627 github.com/astaxie/beego/grace.init.0() /Users/dxm/Documents/code/gopath/src/github.com/astaxie/beego/grace/grace.go:93 +0x7a exit status 2
/usr/local/Cellar/go/1.13.8/libexec/src/flag/flag.go:848 +0x4ae
定位到panic的代碼
panic的原因是 graceful這個flag被定義了兩遍,全局搜索定義此變量的代碼位置,果然找到了兩處,
來自不同目錄下的兩個相同的外部包,均在項目中被引用,所以導致了panic
相同的外部包一個從vendor中導入一個從$GOPATH 導入的具體原因是:
公共類的包A同時存在在$GOPATH下的B包下和Vendor下的C包下,B和C均在項目中被引用,
由於以下原因導致了panic:
- 包導入時首先從vendor中導入然后再看$GOPATH
- C中所依賴的所有外部包的導入路徑均會繼承C的路徑,B同理
- C在vendor中不存在
解決方法
將C拷貝到vendor下