Golang部署服务时出现“no required module provides package”错误怎么办

Golang部署服务时出现“no required module provides package”错误怎么办 我在服务器上构建Docker时遇到了问题,但在本地却没有,以下是堆栈跟踪:

"[6/6] RUN go build -o /main:
0.505 handlers/handlers.go:5:2: no required module provides package githubcom/rousseau-romain/round-timing/shared/components; to add it:
0.505 	go get githubcom/rousseau-romain/round-timing/shared/components
0.505 handlers/auth.go:9:2: no required module provides package githubcom/rousseau-romain/round-timing/views/page; to add it:
0.505 	go get githubcom/rousseau-romain/round-timing/views/page

Dockerfile:11
9 |     COPY . .
10 |
11 | >>> RUN go build -o /main
12 |
13 |     EXPOSE 2468

ERROR: failed to solve: process “/bin/sh -c go build -o /main” did not complete successfully: exit code: 1"

我的仓库是公开的,我认为这不是权限问题,但也许我错了。

https://github.com/rousseau-romain/round-timing

由于链接限制,我不得不将“github.com/”替换为“githubcom/”。

希望有人知道如何帮助我。


更多关于Golang部署服务时出现“no required module provides package”错误怎么办的实战教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

好的,谢谢,我看看!

更多关于Golang部署服务时出现“no required module provides package”错误怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


请提供项目目录结构,如果可能的话,请包含 dockerfile。

peakedshout:

你的代码有问题,导入部分有问题。

我本地的导入方式不对吗?

  1. 检查 go.mod 文件是否正确
  2. 在外部主机上执行 go mod vendor,并将外部库离线复制到容器中。

如果你有生成代码的行为,那么你应该将生成的代码提交到 Git,而不是留下一个原型。

github.com/rousseau-romain/round-timing/views/page 这不是一个有效的 Go 包路径,因为其中没有 Go 文件,而且我不知道你是如何运行它的,但代码本身存在一些问题。

这不是一个好的实践。在构建过程中,如果你不能提供一个 make 构建流程,那么你应该确保代码的完整性。 以 grpc protobuf 为例,它会生成代码,但通常的做法是将生成的代码提交到 git,而不是让构建器在构建时生成它。(生成工具的差异可能导致生成的代码不同)

我找到问题了,我真是太蠢了,哈哈。 我使用 templ 从 .templ 文件生成 go 文件,并且我不想提交生成的文件。 所以很明显,如果我在 Docker 内部不生成 go 文件,它就不会工作。我已经在我的 Dockerfile 中添加了:

RUN go install github.com/a-h/templ/cmd/templ@v0.2.793
RUN templ generate

感谢你的时间和帮助!

你的主包在哪里?你应该尝试(我假设你的 go.mod 文件在当前目录):

rm -rf ./vendor
go mod tidy
go mod vendor
go build -o main . //如果 . 是主包,可以尝试构建 ...
FROM golang:1.22-alpine

WORKDIR /app

COPY . .

RUN go mod tidy // 再试一次

RUN go build -o /main . //如果 . 是主包 -> /app

EXPOSE 2468

CMD ["/main"]

go mod 文件看起来没问题且已更新。 我尝试在 Dockerfile 中的 go mod download 之前添加 go mod vendor,但在查找外部库时遇到了问题。

[7/7] RUN go build -o /main
#11 0.378 main.go:11:2: cannot find module providing package github.com/gorilla/mux: import lookup disabled by -mod=vendor
#11 0.378 	(Go version in go.mod is at least 1.14 and vendor directory exists.)
#11 0.378 config/config.go:8:2: cannot find module providing package github.com/joho/godotenv: import lookup disabled by -mod=vendor

为了将外部库离线复制到容器中,我需要在容器内有我的 vendor 目录。当我在本地构建容器时,我本地有这个包含外部库的目录。

github.com/rousseau-romain/ 是我本地项目的一部分,它也被视为外部库吗?

github.com

rousseau-romain/round-timing/blob/master/handlers/auth.go

package handlers

import (
	"fmt"
	"log"
	"net/http"

	"github.com/rousseau-romain/round-timing/model"
	"github.com/rousseau-romain/round-timing/views/page"

	"github.com/markbates/goth/gothic"
)

func (h *Handler) HandleLogin(w http.ResponseWriter, r *http.Request) {
	page.SigninPage(PagesNav, h.error).Render(r.Context(), w)
}

func (h *Handler) HandleProviderLogin(w http.ResponseWriter, r *http.Request) {
	// try to get the user without re-authenticating
	if u, err := gothic.CompleteUserAuth(w, r); err == nil {

此文件已被截断。显示原文

你的代码有问题,导入部分有问题。 你真的尝试过本地构建吗?这样的代码一眼就知道无法编译。

是的,我的主包是 .,我尝试过,但Alpine镜像中没有安装git,所以我改用 golang:1.22 镜像,这样就没有git问题了。

但现在我在服务器上运行 go mod tidy 时遇到了错误。 我是否需要在GitHub仓库中创建版本标签才能在服务器上构建?

> [4/5] RUN go mod tidy:
1.292 go: downloading github.com/google/go-cmp v0.6.0
1.344 go: downloading google.golang.org/appengine v1.6.8
1.444 go: downloading github.com/golang/protobuf v1.5.3
1.750 go: downloading google.golang.org/protobuf v1.32.0
2.088 go: finding module for package github.com/rousseau-romain/round-timing/views/page
2.089 go: finding module for package github.com/rousseau-romain/round-timing/shared/components
5.754 go: github.com/rousseau-romain/round-timing/handlers imports
5.754 	github.com/rousseau-romain/round-timing/shared/components: no matching versions for query "latest"
5.754 go: github.com/rousseau-romain/round-timing/handlers imports
5.754 	github.com/rousseau-romain/round-timing/views/page: no matching versions for query "latest"

我在本地编译代码时没有遇到任何问题,这很奇怪。 也许我的本地配置/安装有问题,我会尝试卸载并重新安装Go。

➜  round-timing git:(master) ✗ docker build -t round-timing . 
[+] Building 9.4s (10/10) FINISHED                                                                                                                                                                          
 => [internal] load build definition from Dockerfile                                                                                                                                                   0.0s
 => => transferring dockerfile: 73B                                                                                                                                                                    0.0s
 => [internal] load .dockerignore                                                                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                                                                        0.0s
 => [internal] load metadata for docker.io/library/golang:1.22                                                                                                                                         0.0s
 => [internal] load build context                                                                                                                                                                      0.1s
 => => transferring context: 103.52kB                                                                                                                                                                  0.1s
 => [1/5] FROM docker.io/library/golang:1.22                                                                                                                                                           0.0s
 => CACHED [2/5] WORKDIR /app                                                                                                                                                                          0.0s
 => [3/5] COPY . .                                                                                                                                                                                     0.4s
 => [4/5] RUN go mod tidy                                                                                                                                                                              1.2s
 => [5/5] RUN go build -o /main .                                                                                                                                                                      7.3s 
 => exporting to image                                                                                                                                                                                 0.4s 
 => => exporting layers                                                                                                                                                                                0.4s 
 => => writing image sha256:b5de9bc0452740ecd2c9800f2fc1371dda31c1388339c66936bc90c63b64417d                                                                                                           0.0s 
 => => naming to docker.io/library/round-timing

这个错误通常是由于Go模块依赖问题导致的。在你的Docker构建环境中,Go工具链无法找到所需的模块。以下是解决方案:

首先,检查你的go.mod文件是否包含所有必要的依赖。在你的项目中,确保模块路径正确:

# 在项目根目录执行
go mod tidy

对于Docker构建,需要确保正确复制了go.mod和go.sum文件。修改你的Dockerfile:

# 使用多阶段构建
FROM golang:1.21-alpine AS builder

WORKDIR /app

# 复制go模块文件
COPY go.mod go.sum ./
RUN go mod download

# 复制源代码
COPY . .

# 构建应用
RUN CGO_ENABLED=0 GOOS=linux go build -o /main

# 运行阶段
FROM alpine:latest
COPY --from=builder /main /main
EXPOSE 2468
ENTRYPOINT ["/main"]

如果问题仍然存在,检查你的模块引用是否正确。在你的代码中,确保导入路径使用正确的格式:

// 应该是 github.com/rousseau-romain/round-timing/shared/components
import (
    "github.com/rousseau-romain/round-timing/shared/components"
    "github.com/rousseau-romain/round-timing/views/page"
)

另外,确保你的go.mod文件中的模块声明正确:

module github.com/rousseau-romain/round-timing

go 1.21

require (
    // 你的依赖
)

如果依赖是私有模块,需要在Docker构建时配置Git凭证:

# 对于私有仓库
RUN git config --global url."https://${GITHUB_TOKEN}:x-oauth-basic@github.com/".insteadOf "https://github.com/"

最后,清理并重新构建:

# 清理Go模块缓存
go clean -modcache

# 重新下载依赖
go mod download
回到顶部