使用`go build`时如何解决“package is not in GOROOT”?

Vic*_*tor 4 go

我有以下简单的项目架构:

LICENSE     Makefile    README.md   cmd     docs
Run Code Online (Sandbox Code Playgroud)

test/main.go里面的cmd(因为我想构建一个 CLI 工具)。我的 Makefile 包含:

test:
    gofmt -s -w cmd/test/
    go build cmd/test/ -o test
Run Code Online (Sandbox Code Playgroud)

第一个命令gofmt工作正常,但是go build导致错误

package cmd/test is not in GOROOT
Run Code Online (Sandbox Code Playgroud)

正确的编译方法是什么?

mko*_*iva 9

您应该能够使其与以下内容一起使用:

\n
go build -o ./test ./cmd/test/*.go\n
Run Code Online (Sandbox Code Playgroud)\n

这是因为该go build命令将导入路径[packages]列表或.go 文件列表作为其参数作为其参数。

\n
\n

go build [-o output] [build flags] [packages]

\n

Build 编译由导入路径packages命名的文件文件及其依赖项,但不安装结果。

\n

如果构建的参数是单个目录中的 .go 文件列表\n,则 build 将它们视为指定单个包的源文件列表。

\n

...

\n
\n

你的论点cmd/test/既不是导入路径,也不是 .go 文件列表。

\n

如果您想从其目录的内容构建包,您可以使用./cmd/test/*.go,您的 shell 通常会将其替换为该目录中的 .go 文件条目列表。

\n
\n

但请注意,推荐的方法是使用 go 模块。使用 go 模块,您可以通过指定其导入路径而不是目录的内容来构建包。例如,给定一个如下所示的项目结构:

\n
program\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 cmd\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.go\n
Run Code Online (Sandbox Code Playgroud)\n

go mod init从项目的根目录中:

\n
program\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 cmd\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.go\n
Run Code Online (Sandbox Code Playgroud)\n

这将创造一个新的go.mod这将为您的项目

\n
program\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cmd\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.go\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 go.mod\n
Run Code Online (Sandbox Code Playgroud)\n

然后您可以使用其导入路径(植根于模块的路径)构建包,例如:

\n
go mod init program\n
Run Code Online (Sandbox Code Playgroud)\n