“运行”时出现错误“包...不在 GOROOT 中”
Posted
技术标签:
【中文标题】“运行”时出现错误“包...不在 GOROOT 中”【英文标题】:Error "Package ... is not in GOROOT " when "go run" 【发布时间】:2021-04-10 20:28:54 【问题描述】:首先,我想说谢谢你阅读我的主题。我是 Golang 的新手,很高兴收到您的帮助。
我正在为php-fpm-exporter
使用 golang
(https://github.com/hipages/php-fpm_exporter)
我的环境go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/toandp99/.cache/go-build"
GOENV="/home/toandp99/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/toandp99/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/home/toandp99/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/home/toandp99/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build100112555=/tmp/go-build -gno-record-gcc-switches"
当我尝试php-fpm-exporter
toandp99@toandp99-x555uj:~/php-fpm_exporter$ ls
cmd Dockerfile LICENSE phpfpm README.md
CODE_OF_CONDUCT.md go.mod main.go PHP-FPM.pid sonar-project.properties
config.sh go.sum Makefile PHP-FPM.sh test
toandp99@toandp99-x555uj:~/php-fpm_exporter$ ./PHP-FPM.sh start
Starting Monitoring FastCGI Process Manager...go: downloading github.com/spf13/cobra v0.0.7
go: downloading github.com/speps/go-hashids v2.0.0+incompatible
go: downloading github.com/davecgh/go-spew v1.1.1
go: downloading github.com/gosuri/uitable v0.0.4
go: downloading github.com/tomasen/fcgi_client v0.0.0-20180423082037-2bb3d819fd19
go: downloading github.com/fatih/color v1.9.0
go: downloading github.com/mattn/go-isatty v0.0.12
go: downloading golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527
go: downloading github.com/spf13/pflag v1.0.5
go: downloading github.com/mattn/go-colorable v0.1.6
go: downloading github.com/prometheus/client_golang v1.5.1
go: downloading github.com/mattn/go-runewidth v0.0.8
go: downloading github.com/prometheus/common v0.9.1
go: downloading github.com/prometheus/client_model v0.2.0
go: downloading github.com/cespare/xxhash v1.1.0
go: downloading github.com/prometheus/procfs v0.0.10
go: downloading github.com/golang/protobuf v1.3.4
go: downloading github.com/cespare/xxhash/v2 v2.1.1
go: downloading github.com/beorn7/perks v1.0.1
go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1
cmd/server.go:29:2: package client_golang-master/prometheus is not in GOROOT (/home/toandp99/local/go/src/client_golang-master/prometheus)
cmd/server.go:30:2: package client_golang-master/prometheus/promhttp is not in GOROOT (/home/toandp99/local/go/src/client_golang-master/prometheus/promhttp)
cmd/root.go:29:2: package cobra-master is not in GOROOT (/home/toandp99/local/go/src/cobra-master)
cmd/root.go:27:2: package go-homedir is not in GOROOT (/home/toandp99/local/go/src/go-homedir)
cmd/root.go:28:2: package logrus-master is not in GOROOT (/home/toandp99/local/go/src/logrus-master)
cmd/root.go:26:2: package php-fpm_exporter/phpfpm is not in GOROOT (/home/toandp99/local/go/src/php-fpm_exporter/phpfpm)
cmd/root.go:30:2: package viper-master is not in GOROOT (/home/toandp99/local/go/src/viper-master)
在 bash 文件 (PHP-FPM.sh) 中,我运行此命令
go run main.go server --web.listen-address $PHP_FPM_WEB_LISTEN_ADDRESS --log.level=$PHP_FPM_LOG_LEVEL --phpfpm.scrape-uri $PHP_FPM_SCRAPE_URI --web.telemetry-path $PHP_FPM_WEB_TELEMETRY_PATH --phpfpm.fix-process-count = $PHP_FPM_FIX_PROCESS_COUNT
我不知道如何修复这个错误:( 谢谢
【问题讨论】:
this 有帮助吗? @tink 我已阅读但我不知道我将删除哪个文件夹 go mod ?因为我之前不使用go mod init
:(
从不使用go run main.go
。习惯go build
然后启动生成的可执行文件。初学者基本上有 0 机会获得 go run
且文件参数正确。
【参考方案1】:
此错误主要发生在您的项目不在GoPATH 中以解决此问题时使用GO111MODULE=auto
(详情请使用Click here)
在 Go 中,项目应该在一个特定的位置 (GOPATH
) 来解决这个问题 Go Modules 出现,它帮助我们在 go 路径之外运行 go 程序。默认情况下,Go 语言使用 GoPATH,您可以通过将环境变量 GO11MODULE
更改为 auto
(如果您的项目不在 GoPATH 中,将使用 GO 模块)或 on
(将始终使用 GO 模块,甚至如果您的项目位于 GOPATH)
注意:
查看您的项目,您似乎已经初始化了 Go 模块(存在 go.mod
)这就是为什么我不建议初始化 go 模块(可以通过运行 go mod init
来完成)
【讨论】:
我用export GO111MODULE=auto
修改了GO111MODULE,但它似乎没有改变:(
尝试在go mod init
之后运行go mod download
,然后查看结果
@PhuToan 当您导出任何变量时,它只会为该会话更改。要永久更新 env 变量,您需要在 $HOME/.profile
文件中设置它的值,就像您为 GOPATH
所做的那样
当我改变 GO111MODULE 的值时,我检查了go env
它改变了,但结果似乎没有改变。我正在尝试其他方式,我将我的项目移动到 GOPATH
并关闭 GO111MODULE,它在下面返回其他结果
``` ../src/github.com/spf13/viper/viper.go:49:2:在以下任何一个中找不到包“gopkg.in/ini.v1”:/home /toandp99/local/go/src/gopkg.in/ini.v1(来自 $GOROOT)/home/toandp99/go/src/gopkg.in/ini.v1(来自 $GOPATH)../src/github.com /spf13/viper/viper.go:50:2: 在 /home/toandp99/local/go/src/gopkg.in/yaml.v2 中找不到包“gopkg.in/yaml.v2”(来自 $ GOROOT)/home/toandp99/go/src/gopkg.in/yaml.v2(来自$GOPATH)```【参考方案2】:
在我的情况下,我在 docker 中遇到了 GOROOT 权限问题,因为“go.mod”和“go.sum”文件不在正确的目录位置。
【讨论】:
以上是关于“运行”时出现错误“包...不在 GOROOT 中”的主要内容,如果未能解决你的问题,请参考以下文章