背景
最近項目使用中有用到go mod 和 goyacc工具。goyacc涉及到編譯原理的詞法分析,文法分析等功能,可以用來生成基于golang的語法分析文件。本期是記錄一個使用中遇到的依賴相關的問題。因為用到goyacc,需要生成goyacc的可執(zhí)行文件。
而項目使用了go mod 去管理依賴,包括因為golang版本,導致后續(xù)遇到很多的問題,這里進行下記錄。
分析
首先,本地的golang版本是1.15.6 linux/amd64。在1.8以后,goyacc被移動到了golang.org/x/tools/cmd/goyacc中。而我的項目用了go mod管理依賴,同時會將依賴放置到本地的vendor目錄下。但是詭異的是,在執(zhí)行go mod vendor
以后,在vendor目錄下,找不到golang.org/x/tools。即便在go.mod文件中已經(jīng)引入golang.org/x/tools的依賴。
而依賴寫入到go.mod中,如下:
golang.org/x/tools v0.1.4
甚至于想過使用某些第三方的依賴來添加goyacc,但這個語法解析屬于非常底層核心的功能,擔心有風險,也就沒采用這種方法。
根據(jù)如上描述的問題,經(jīng)過嘗試,需要在某個代碼中做一次導入,才會在vendor目錄中出現(xiàn),如下:
import (
//在這里引用這個可以實現(xiàn)在vendor中導入
_ "golang.org/x/tools/cmd/goyacc"
"testing"
)
不知道是go mod需要配置下,還是它目前的機制就是這樣的,或者說是一種特性。這樣使用還是有些不太方便的。經(jīng)過如上的修改后,確實能夠找到golang.org/x/tools了。但是又出現(xiàn)新的問題。
在使用go build生成goyacc可執(zhí)行文件的時候,出現(xiàn)如下的報錯。
go build -o ./bin/goyacc ./vendor/golang.org/x/tools/cmd/goyacc
without -mod=vendor, directory xxx/vendor/golang.org/x/tools/cmd/goyacc has no package path
根據(jù)報錯在網(wǎng)上搜索一圈沒找到解決版本,相關的資料也很少。于是又回到報錯的信息,嘗試在build命令后加上報錯信息提示的參數(shù),最終項目編譯通過了。如下:
go build -mod=vendor -o ./bin/goyacc ./vendor/golang.org/x/tools/cmd/goyacc
總結(jié)
以上就是本期的內(nèi)容,目前對于golang mod 等依賴管理的使用還是不太熟悉,而且和java成熟的maven等機制來比較,確實還是有些差距,使用起來不是很方便,期待往后可以更好吧。