go語言,第三方包相對路徑匯入包引起的問題及解決方案(goquery)
對go語言而言,跟蹤init很顯然包有且僅有一次被匯入的可能。
但是重複引用了goquery包,後編譯出現問題
專案涉及相關目錄
├── main.go
└── parse
└── parse.go
parse包和main.go都匯入了 goquery包
main.go 通過 import("./parse")匯入parse包
go run 和 go build 都提示錯誤
# command-line-arguments
/usr/lib/golang/pkg/tool/linux_amd64/link: cannot open file /usr/lib/golang/pkg/linux_amd64/github.com/PuerkitoBio/goquery.a: open /usr/lib/golang/pkg/linux_amd64/github.com/PuerkitoBio/goquery.a: no such file or directory
main.go 在不匯入 parse時並無錯誤,說明肯定是parse的鍋
查看了gopath pkg 裡明明有.a檔案 但是為什麼尋找到去goroot下尋找.a檔案
最後先是找到了解決方案 把parse匯入方式切換到絕對路徑(這裡的絕對路徑是相對於gopath或者goroot而言,即包的真實路徑去掉gopath/src或者goroot/src)匯入即可,後發現編譯情況下link引數是空目錄
go run -n main.go 命令僅列印其執行過程中用到的所有命令,而不去真正執行它們。用這個命令跟蹤編譯過程是十分合適的。
執行結果如下
1 cd /home/fdf/golang/src/distributed_spider/parse相對路徑匯入情況2 /usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/_/home/fdf/golang/src/distributed_spider/parse.a -trimpath $WORK -goversion go1.9.4 -p _/home/fdf/golang/src/distributed_spider/parse -complete -buildid 310d9ff51b345d53a619be2244f0ac16bed09600 -D _/home/fdf/golang/src/distributed_spider/parse -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./parse.go3 4 # 5 # command-line-arguments 6 # 7 8 mkdir -p $WORK/command-line-arguments/_obj/ 9 mkdir -p $WORK/command-line-arguments/_obj/exe/ 10 cd /home/fdf/golang/src/distributed_spider 11 /usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/command-line-arguments.a -trimpath $WORK -goversion go1.9.4 -p main -complete -buildid 69bf6dce457753ca5df015e4ac3556bd5ca464b1 -dwarf=false -D _/home/fdf/golang/src/distributed_spider -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./main.go 12 cd . 13 /usr/lib/golang/pkg/tool/linux_amd64/link -o $WORK/command-line-arguments/_obj/exe/main -L $WORK -L "" -s -w -extld=gcc -buildmode=exe -buildid=69bf6dce457753ca5df015e4ac3556bd5ca464b1 $WORK/command-line-arguments.a 14 $WORK/command-line-arguments/_obj/exe/main
1 # 2 # distributed_spider/parse 3 # 4 5 mkdir -p $WORK/distributed_spider/parse/_obj/ 6 mkdir -p $WORK/distributed_spider/ 7 cd /home/fdf/golang/src/distributed_spider/parse 8 /usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/distributed_spider/parse.a -trimpath $WORK -goversion go1.9.4 -p distributed_spider/parse -complete -buildid 310d9ff51b345d53a619be2244f0ac16bed09600 -D _/home/fdf/golang/src/distributed_spider/parse -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./parse.go 9 10 # 11 # command-line-arguments 12 # 13 14 mkdir -p $WORK/command-line-arguments/_obj/ 15 mkdir -p $WORK/command-line-arguments/_obj/exe/ 16 cd /home/fdf/golang/src/distributed_spider 17 /usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/command-line-arguments.a -trimpath $WORK -goversion go1.9.4 -p main -complete -buildid fbcca07f20e1f56c4f1a586a3c879bde6e112ba5 -dwarf=false -D _/home/fdf/golang/src/distributed_spider -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./main.go 18 cd . 19 /usr/lib/golang/pkg/tool/linux_amd64/link -o $WORK/command-line-arguments/_obj/exe/main -L $WORK -L /home/fdf/golang/pkg/linux_amd64 -s -w -extld=gcc -buildmode=exe -buildid=fbcca07f20e1f56c4f1a586a3c879bde6e112ba5 $WORK/command-line-arguments.a 20 $WORK/command-line-arguments/_obj/exe/main絕對路徑匯入情況
跟蹤發現 有差異的情況的確是 在相對路徑下 -L的引數缺失了 goopath(相對..情況13行和絕對..情況19行)
導致 link去goroot下尋找
至於為什麼會出現這種情況 還沒弄明白,感覺真的像編譯這邊的bug。。。 明明前面編譯的過程中都是能尋找到並輸入.a檔案的
但是匯入包的時候儘量寫絕對路徑。