“包 XXX 不在 GOROOT”在建设一个围棋项目

我有一个奇怪的问题,出现了当我从这个项目休息。在启动 Goland 之后,我在尝试运行我的项目时出现了很多错误。

在构建我的一个包时,具体的错误是: start.go: package project/game is not in GOROOT (C:\Go\src\project\game)

我在 C:\Users\username下有这样一个文件夹结构

go
|-src
|-project
|-game
|-entity
|-whatever.go
|-game_stuff.go
|-server

而我的同胞们就是这样的人:

GOROOT=C:\Go
GOPATH=C:\Users\ketchup\go

对于每个模块(project/game/tity、 project/game、 project/server) ,我都做了一个 git mod init

在建设过程中,戈兰德将尝试运行这种模式:

C:\Go\bin\go.exe build -o C:\Users\ketchup\AppData\Local\Temp\___go_build_project_server.exe project/server

然后返回错误。

有人能帮我解决这个问题吗?上次我打开它的时候 Goland 还好好的,我有点迷路了。我甚至不知道该朝哪个方向看——我对 Go 还是个新手,也不知道该看什么文档: 谢谢大家!

270489 次浏览

一个相当愚蠢的结论(主要是我的部分) ,但是我的问题来自于在每个文件夹中都做了 go mod init。从我做 go mod init的每个文件夹中删除 go.modgo.dep之后,我可以毫无问题地构建(通过终端)

另外,GoLand 中的包没有被检测到,因为我在设置中启用了 Go 模块。我禁用了它,GoLand 能够索引外部软件包和我自己的软件包。

对于那些在停止使用 想要模块之后还要使用 GoLand 的用户,请确保在首选项中检查“ Enable Go 模块集成”:

Enable Go Modules Intergration

您可能有 GO111MODULE 设置为“上”,这将是去模块。关闭 GO111MODULE 可以解决这个问题。

go env -w GO111MODULE=off

我犯了一个错误,手动更改 go.mod文件中的模块名称。修复后,它工作正常。

└── hello
├── go.mod
├── go.sum
├── hello.go
└── morestrings
├── reverse.go
└── reverse_test.go

hello.go节选

import (
...
"hello/morestrings"
...
)


在 hello 目录中运行 go build会产生以下错误:

Go: 5:2: package hello/morestings 不在 GOROOT (/usr/local/go/src/hello/mostrings)中

在运行命令 go mod init时,您需要添加文件夹名,而不是 main.go 页面名。 比如: go mod init confirm_enrl.confirm_enrl是项目文件夹名

我在项目布局中遇到了同样的错误

     project
|- pgk
|- src
|-module1
|- some.go
|- main.go

去吧

package module1


...

总部,开始

import "project/module1"

最初,我通过 ./module1导入模块1,出现错误 package module1 is not in GOROOT。我通过 import "project/module1"解决它。

附注: 根据 戈兰工程布置图戈兰工程布置图src不应该在戈朗项目。

所以,如果你运行 go mod init‘ xxx’,xxx 就是你项目的核心名称。在这些主包中,完整的名称是“ xxx/main”,所以如果你有这样的项目根文件夹:

root -> go mod init xxx
|- main.go -> package "main"
|- tools
|- helper.go -> package "tools"

你想从 main.go 导入工具包你需要导入这个“ xxx/tools”

我得到了同样的错误时,我有一个拼写错误的软件包的名称。因此,它可能是这个错误背后的根本原因。也许对某些人有用。

我遇到了同样的问题时,我正在跟随去开始教程与黄金默认 awesomeProject。 我在创建项目之后运行这个命令 go mod init example.com/hello,但是我的根目录名不同于 example.com/hello

在手动编辑 go.mod 文件并用 example.com/hello替换 awesomeProject之后,构建工作成功。

我知道这是一年前的事了。我只是想分享那些谁有相同的经验,在本地文件夹中的模块。.

问题在于您没有将模块发布到类似 github 的中心位置。 您必须运行这个命令来告诉 go 这个模块是一个本地模块

go mod edit --replace external_folder_module_name= ../pathItsLocated

我在构建 Docker 映像时也遇到了类似的错误,错误是 #19 0.785 controllers/vasaprovider_controller.go:28:2: package vasa-operator/config/configs is not in GOROOT

在 Dockerfile 添加了 go 文件位置之后,我觉得很有用,我添加的行是:

COPY config/configs config/configs/


COPY --from=builder /workspace/config/configs config/configs/

对于我的情况只是更新我的 加油到最新解决的问题。

下载了最新的二进制文件和安装它,轰的一声,一切都解决了!

在我的例子中,我试图从错误的目录构建。旧目录甚至没有任何 .go文件。

确保您的 import 语句与您在 gomod 中定义的模块名称相匹配。

只是初始化与 mod 文件的项目,并开始对根文件夹的工作。

go mod init <name-anything>

在 Go 的新版本(后1.13)中,您不需要设置诸如 GOPATHGOBIN等环境变量。

您还需要在项目根目录中有一个 go.mod文件。这将使目录成为 Go 模块。这也是 .git/所在的位置。这意味着每个存储库只需要一个 go.mod。在项目根目录中,您可以执行 go mod init remote-repo.com/username/repository

我在 macOS 上安装了使用 HomebrewGo,所以 GOROOT/opt/homebrew/Cellar/go/1.17.5/libexec。此位置包含 Go 的标准库和运行时。

testrun命令以 go COMMAND package_path/xxx格式运行。如果没有指定 package _ path ./并且只运行 go COMMAND xxx,编译器就会假设模块 谢谢位于 GOROOT,并抛出错误 package xxx is not in GOROOT (path/to/GOROOT/src/xxx),因为它不存在。

这种行为是预期的,因为我们正在使用的包不是 Go SDK 的一部分,也就是说,不在 GOROOT中。我们正在使用的软件包要么会出现在 go 工作区,要么会出现在当前的工作目录中。运行 go install编译并放入 $GOBIN中的一个可执行二进制文件(也就是 $GOPATH/bin-这里的 $GOPATH是 Go 工作区)。从包内部运行 go build编译并将可执行文件放在该目录中。

您还没有列出 server/包中的文件以及哪个文件具有主要功能,因此我将模拟计算器的3个工作流,每个工作流演示更多的复杂性。最后一个工作流与您的目录结构类似。

目录结构

版本一:

  • 从包裹开始

  • 基本功能

calculatorv1
├── go.mod                      <- go mod init github.com/yourname/calculatorv1
└── basic/
├── add.go
├── add_test.go
├── main.go
├── multiply.go
└── multiply_test.go

第二版:

  • 更多的功能

  • 多个包裹

calculatorv2
├── go.mod                      <- go mod init github.com/yourname/calculatorv2
├── main.go
└── basic/
│   ├── add.go
│   ├── add_test.go
│   ├── multiply.go
│   └── multiply_test.go
└─── advanced/
├── square.go
└── square_test.go

第三版:

  • 更多的功能

  • 嵌套包

calculatorv3
├── go.mod                      <- go mod init github.com/yourname/calculatorv3
├── main.go
└── basic/
│   ├── add.go
│   ├── add_test.go
│   ├── multiply.go
│   └── multiply_test.go
└─── advanced/
├── square.go
├── square_test.go
└── scientific/
├── declog.go
└── declog_test.go

工作流程

注意: 根据使用的版本,用 basicadvancedadvanced/scientific替换 xxx

  • 使用 go mod init初始化项目目录(calculatorv1calculatorv2calculatorv3之一)中的 Go 模块

  • 做测试

    go test -v ./...(从项目根目录,递归地执行所有测试套件)

    或者

    go test -v ./xxx(从项目根目录,运行包“ xxx”中的测试套件)

    或者

    cd xxx/
    go test -v            # (from inside the package)
    
  • 编译并执行包

    go run ./...(从项目根目录,递归地运行除测试之外的所有 .go文件)

    或者

    go run ./xxx(从项目根目录运行“ xxx”包中的所有 .go文件,测试除外)

    或者

    cd xxx
    go run .              # (from inside the package)
    

    注意 : 只有主包中的文件是可执行的,即声明为 package main的文件。这意味着 go run ./xxx只能用于版本1,而不能用于版本2和3。因此,对于版本2和版本3,运行 go run main.go


密码

非常容易填补不完整的位

版本1

加注,开始

package main


func addition(x int, y int) int {
return x + y
}

Add _ test. go

package main


import "testing"


func TestAdd(t *testing.T) {


t.Run("adding two positive numbers", func(t *testing.T) {
sum := addition(2, 2)
expected := 4
        

if sum != expected {
t.Errorf("Expected %d; but got %d", expected, sum)
}
})
    

t.Run("adding two negative numbers", func(t *testing.T) {
sum := addition(-3, -4)
expected := -7


if sum != expected {
t.Errorf("Expected %d; but got %d", expected, sum)
}
})


t.Run("adding one positive and one negative integer", func(t *testing.T) {
sum := addition(1, -3)
expected := -2


if sum != expected {
t.Errorf("Expected %d; but got %d", expected, sum)
}
})
    

}

总部,开始

package main


import "fmt"


func main() {
var num1 int = 1
var num2 int = 2
    

sum := addition(num1, num2)
product := multiplication(num1, num2)


fmt.Printf("The sum of %d and %d is %d\n", num1, num2, sum)
fmt.Printf("The multiplication of %d and %d is %d\n", num1, num2, product)
}

版本2

总部,开始

package main


import (
"fmt"
"github.com/yourname/calculatorv2/basic"
"github.com/yourname/calculatorv2/advanced"
)


func main() {
var num1 int = 1
var num2 int = 2
    

product := basic.Multiplication(num1, num2)
square := advanced.Square(num2)


fmt.Printf("The product of %d and %d is %d\n", num1, num2, product)
fmt.Printf("The square of %d is %d\n", num2, square)
}

乘法,开始

package basic


func Multiplication(x int, y int) int {
return x * y
}

开始

package basic


import "testing"


func TestMultiply(t *testing.T) {


t.Run("multiplying two positive numbers", func(t *testing.T) {
sum := Multiplication(2, 2)
expected := 4
        

if sum != expected {
t.Errorf("Expected %d; but got %d", expected, sum)
}
})
    

t.Run("multiplying two negative numbers", func(t *testing.T) {
sum := Multiplication(-3, -4)
expected := 12


if sum != expected {
t.Errorf("Expected %d; but got %d", expected, sum)
}
})


t.Run("multiplying one positive and one negative integer", func(t *testing.T) {
sum := Multiplication(1, -3)
expected := -3


if sum != expected {
t.Errorf("Expected %d; but got %d", expected, sum)
}
})
    

}

准备,开始

package advanced


func Square(x int) int {
return x * x
}

版本3

总部,开始

package main


import (
"fmt"
"github.com/yourname/calculatorv3/basic"
"github.com/yourname/calculatorv3/advanced"
"github.com/yourname/calculatorv3/advanced/scientific"
)


func main() {
var num1 int = 1
var num2 int = 2
var num3 float64 = 2
    

product := basic.Multiplication(num1, num2)
square := advanced.Square(num2)
decimallog := scientific.DecimalLog(num3)


fmt.Printf("The product of %d and %d is %d\n", num1, num2, product)
fmt.Printf("The square of %d is %d\n", num2, square)
fmt.Printf("The decimal log (base 10) of %f is %f\n", num3, decimallog)
}

准备,开始

package advanced


func Square(x int) int {
return x * x
}

Declog 开始

package scientific


import "math"


func DecimalLog(x float64) float64 {
return math.Log10(x)
}

Declog _ test. go

package scientific


import "testing"


func TestDecimalLog(t *testing.T) {


t.Run("adding two positive numbers", func(t *testing.T) {
sum := DecimalLog(100)
expected := 2.0
        

if sum != expected {
t.Errorf("Expected %f; but got %f", expected, sum)
}
})
    

t.Run("adding two negative numbers", func(t *testing.T) {
sum := DecimalLog(10)
expected := 1.0


if sum != expected {
t.Errorf("Expected %f; but got %f", expected, sum)
}
})
}

我们可以通过在终端 go env -w GO111MODULE=off上编写这个命令来解决这个问题

但是在这个命令之后,您将无法通过终端使用 go mod init。您必须手动创建“ go.mod”文件。

在我的例子中,这是由于改变了 goroot 路径。

GOROOT 是一个变量,它定义 Go SDK 的位置

它将工作,如果你改变你 goroot 到你安装的地方去 sdk

这看起来有点好笑,但是因为跑步,我面临着同样的错误:

go run build

而不是

go build main.go

所以它表明,在 建造快跑之后的所有东西都应该有一个可识别的路径。

对我来说,这是因为我的 main 方法不在 package main 中

package main


func main() {
{


}

遇到这个问题,删除了 go.mod & go.sum 文件,然后使用

go mod init

这解决了我的问题:)

Windows PC 用户

对我来说,问题在于我试图如何运行这个项目

而在根文件夹的项目和我的 main.go文件是在 /cmd/web/

当我试图同时经营这两家公司时,我面临着这个问题

go run cmd/web/. go run /cmd/web/.

只有当我使用

go run ./cmd/web/.

注意开头的 .

在我的例子中,serverless.yamlfunctions中函数的 handler路径是不正确的

在我自己的例子中,我使用的是 go run main而不是 go run main.go