1. 程式人生 > >go語言,第三方包相對路徑匯入包引起的問題及解決方案(goquery)

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.go
3 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檔案的

但是匯入包的時候儘量寫絕對路徑。