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

新手上路,请多包涵

我正在使用带有模块支持的 go 1.11。我知道 go 工具现在会在构建/安装时自动安装依赖项。我也明白其中的道理。

我正在使用 docker 来构建我的二进制文件。在许多其他生态系统中,复制依赖项清单(package.json、requirements.txt 等)并将依赖项安装为独立于构建的独立阶段是很常见的。这利用了 docker 的层缓存,并使重建更快,因为通常代码更改远远超过依赖项更改。

我想知道vgo有没有办法做到这一点?

原文由 Alex Guerra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 706
2 个回答

这是一个问题 #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"]


另请参阅文章 Containerize Your Go Developer Environment – Part 2 ,其中描述了如何利用 Go 编译器缓存 来进一步加速构建。

原文由 rustyx 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

  1. 运行 go mod vendor 命令以获得依赖项的实际版本。
  2. 保存/缓存此 vendor 文件夹。
  3. 在构建期间,恢复此 vendor 文件夹,并通过将 -mod=vendor 参数传递给 go 工具来构建/安装您的应用程序,因此不会下载任何依赖项,但 vendor 将使用文件夹。

引用自 go help mod

模块和销售

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

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

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

原文由 icza 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题