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
好的,谢谢,我看看!
更多关于Golang部署服务时出现“no required module provides package”错误怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
请提供项目目录结构,如果可能的话,请包含 dockerfile。
peakedshout:
你的代码有问题,导入部分有问题。
我本地的导入方式不对吗?
- 检查 go.mod 文件是否正确
- 在外部主机上执行
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/ 是我本地项目的一部分,它也被视为外部库吗?
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

