Go模塊編譯問題及解決方法

 

  1. 錯誤“dial tcp 172.217.24.17:443: i/o timeout

對如下編譯錯誤:

go build -o hello main.go

build command-line-arguments: cannot load google.golang.org/grpc: module google.golang.org/grpc: Get https://proxy.golang.org/google.golang.org/grpc/@v/list: dial tcp 172.217.24.17:443: i/o timeout

 

有兩個解決辦法:

  • 代理方式

即在執行前先設置好環境變量“GOPROXY”和“GO111MODULE”:

export GO111MODULE=on

export GOPROXY=https://goproxy.io或者export GOPROXY=https://goproxy.cn

 

對於1.13及以上版本,可直接如下這樣:

go env -w GOPROXY=https://goproxy.cn,direct

 

推薦使用七牛雲的“goproxy.cn”,因爲“goproxy.io”也不一定可用。自動下載的包被放在用戶的主目錄(實爲GOPATH目錄,可執行“go env|grep GOPATH”確認)下,完整路徑爲:~/go/pkg/mod,如:

$ls -l ~/go/pkg/mod

total 0

drwxr-xr-x  4 guest  staff  128  2 21 14:11 cache

drwxr-xr-x  3 guest  staff   96  2 21 14:11 github.com

drwxr-xr-x  3 guest  staff   96  2 21 14:11 golang.org

drwxr-xr-x  4 guest  staff  128  2 21 14:11 google.golang.org

 

 

如遇到如下錯誤:

go: downloading google.golang.org/grpc v1.27.1

build command-line-arguments: cannot load google.golang.org/grpc: open /Users/guest/go/pkg/mod/cache/download/google.golang.org/grpc/@v/v1.27.1.lock: permission denied

 

請在執行時加上“sudo”,比如:

sudo go build -o hello hello.go

 

  • 使用“go mod”的“replace”命令,將網絡路徑改成本地路徑(當編譯環境不能網絡自動下載時解決辦法),如:

$cat go.mod

module hello

 

go 1.13

 

require google.golang.org/grpc v1.27.1 // indirect

 

replace google.golang.org/grpc => /usr/local/go/src/google.golang.org/grpc

 

注意,replace中的不一定需出現在require中。

 

  1. 錯誤“missing dot in first path element”

如下錯誤可能是需要先到上一級目錄先編譯一次:

build command-line-arguments:

cannot load test/hello:

malformed module path "test/hello": missing dot in first path element

 

也有可能是import問題,比如下面這樣:

import (

  "fmt"

  myproto "proto"

)

import (

  "test/proto"

)

 

得把myproto那一行刪除。

 

  1. 錯誤“but does not contain package”

build command-line-arguments:

cannot load github.com/go-redis/redis/v7:

module github.com/go-redis/redis/v7@latest found (v7.2.0),

but does not contain package github.com/go-redis/redis/v7

 

這個可能是因爲沒有目錄的可執行和文件的讀取權限,比如go-redis的屬主是root,而使用的是非root,解決辦法是爲目錄增加可執行權限和文件增加可讀權限。

 

  1. 錯誤“go.mod: no such file or directory”

go: google.golang.org/[email protected]:

parsing /usr/local/go/src/google.golang.org/grpc/go.mod:

open /usr/local/go/src/google.golang.org/grpc/go.mod: no such file or directory

 

遇到這個錯誤時,可嘗試將go.mod文件刪除後重執行“go mod init”操作,然後再執行“go build”編譯。執行“go build”有個提前,即要能拉取(go get)互聯網上的依賴的包。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章