为了账号安全,请及时绑定邮箱和手机立即绑定

从 go.mod 手动获取依赖项?

从 go.mod 手动获取依赖项?

Go
智慧大石 2023-04-04 14:16:30
我正在使用带有模块支持的 go 1.11。我知道 go 工具现在会在构建/安装时自动安装依赖项。我也明白其中的道理。我正在使用 docker 来构建我的二进制文件。在许多其他生态系统中,复制依赖项清单(package.json、requirements.txt 等)并将依赖项安装为独立于构建的独立阶段是很常见的。这利用了 docker 的层缓存,并使重建更快,因为通常代码更改远远超过依赖项更改。我想知道vgo有没有办法做到这一点?
查看完整描述

4 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

这是一个问题#26610,现在已修复。

所以现在你可以使用:

go mod download

为此,您只需要go.mod/go.sum文件。

例如,下面是如何进行缓存的多阶段 Docker 构建:

FROM golang:1.17-alpine as builder

RUN apk --no-cache add ca-certificates git

WORKDIR /build


# Fetch dependencies

COPY go.mod go.sum ./

RUN go mod download


# Build

COPY . ./

RUN CGO_ENABLED=0 go build


# Create final image

FROM alpine

WORKDIR /

COPY --from=builder /build/myapp .

EXPOSE 8080

CMD ["./myapp"]


查看完整回答
反对 回复 2023-04-04
?
aluckdog

TA贡献1847条经验 获得超7个赞

您可以使用将在主模块的根文件夹中go mod vendor创建一个文件夹的命令,并将所有依赖项复制到其中。vendor在此之后,您可以将-mod=vendor参数传递给 go 工具,然后vendor文件夹中的依赖项将用于构建/编译/测试您的应用程序。

那么你可以做些什么来加速你的构建:

  1. 运行go mod vendor命令以获得依赖项的实际版本。

  2. 保存/缓存此vendor文件夹。

  3. 在构建期间,恢复此vendor文件夹,并通过将参数传递给 go 工具来构建/安装您的应用程序-mod=vendor,因此不会下载任何依赖项,但vendor会使用该文件夹的内容。

引用自go help mod

模块和销售

使用模块时,go 命令完全忽略供应商目录。

默认情况下,go 命令通过从源下载模块并使用这些下载的副本来满足依赖关系(如前一节所述,在验证之后)。为了允许与旧版本的 Go 互操作,或确保用于构建的所有文件都存储在一个文件树中,'go mod vendor' 在主模块的根目录中创建一个名为 vendor 的目录并将所有文件存储在那里来自依赖模块的包,这些包需要支持主模块中包的构建和测试。

要使用主模块的顶级供应商目录进行构建以满足依赖性(禁用通常的网络资源和本地缓存),请使用“go build -mod=vendor”。请注意,仅使用主模块的顶级供应商目录;其他位置的供应商目录仍然被忽略。


查看完整回答
反对 回复 2023-04-04
?
LEATH

TA贡献1936条经验 获得超6个赞

我想使用 重新下载所有依赖项go mod,这就是我所做的:

  1. 去你的GOROOT

  2. sudo rm -rf pkg/mod/

  3. 转到文件go.mod所在的目录

  4. go mod download


查看完整回答
反对 回复 2023-04-04
?
隔江千里

TA贡献1906条经验 获得超10个赞

您可以使用包管理器,其中有很多,例如dep、glide和govendor。dep较新,将作为官方依赖管理工具集成到 go 工具链中。

我们还为 go 应用程序制作 docker 镜像,我们使用dind制作这些镜像,我们准备了一个预装了所有依赖项的 CI/CD 镜像,以加快构建速度。不过,需要编写一些脚本才能将所有内容粘合在一起。

此外,将依赖项分层可能会导致 docker 镜像的体积变大。我建议尝试多阶段构建,这有助于使图像变得超级精简。


查看完整回答
反对 回复 2023-04-04
  • 4 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信