我有以下简单的项目架构:
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)
正确的编译方法是什么?
您应该能够使其与以下内容一起使用:
\ngo build -o ./test ./cmd/test/*.go\nRun Code Online (Sandbox Code Playgroud)\n这是因为该go build命令将导入路径[packages]列表或.go 文件列表作为其参数作为其参数。
\n\n\n
go build [-o output] [build flags] [packages]Build 编译由导入路径
\npackages命名的文件文件及其依赖项,但不安装结果。如果构建的参数是单个目录中的 .go 文件列表\n,则 build 将它们视为指定单个包的源文件列表。
\n...
\n
你的论点cmd/test/既不是导入路径,也不是 .go 文件列表。
如果您想从其目录的内容构建包,您可以使用./cmd/test/*.go,您的 shell 通常会将其替换为该目录中的 .go 文件条目列表。
但请注意,推荐的方法是使用 go 模块。使用 go 模块,您可以通过指定其导入路径而不是目录的内容来构建包。例如,给定一个如下所示的项目结构:
\nprogram\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\nRun Code Online (Sandbox Code Playgroud)\n你go mod init从项目的根目录中:
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\nRun Code Online (Sandbox Code Playgroud)\n这将创造一个新的go.mod这将为您的项目
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\nRun Code Online (Sandbox Code Playgroud)\n然后您可以使用其导入路径(植根于模块的路径)构建包,例如:
\ngo mod init program\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
29094 次 |
| 最近记录: |