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

时间:2018-09-10 22:29:47

标签: go go-modules

我正在使用带有模块支持的go 1.11。我知道go工具现在可以在构建/安装时自动安装依赖项。我也了解原因。

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

我想知道vgo有什么办法吗?

4 个答案:

答案 0 :(得分:6)

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

因此,您可以采取哪些措施来加快构建速度:

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

引用vendor

  

模块和供应商

     

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

     

默认情况下,go命令通过下载模块来满足依赖关系   从他们的来源并使用那些下载的副本(经过验证后,   如上一节所述)。允许与老年人互操作   版本,或确保存储用于构建的所有文件   一起在单个文件树中,“ go mod vendor”创建了一个名为   供应商位于主模块的根目录中,并将所有   支持构建和构建所需的依赖模块中的软件包   主模块中的程序包测试。

     

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

答案 1 :(得分:1)

这是一个#26610问题,现已解决。

所以现在您可以使用:

go mod download

要执行此操作,您只需要go.mod / go.sum文件。

例如,以下是具有缓存的多阶段Docker构建的方法:

FROM golang:1.12-alpine as builder
RUN apk --no-cache add ca-certificates git
WORKDIR /build/myapp

# Fetch dependencies
COPY go.mod ./
RUN go mod download

# Build
COPY . ./
RUN CGO_ENABLED=0 go build

# Create final image
FROM alpine
WORKDIR /root
COPY --from=builder /build/myapp/myapp .
EXPOSE 8080
CMD ["./myapp"]

答案 2 :(得分:0)

您可以使用包管理器,其中有许多类似depglidegovendordep较新,将作为正式的依赖管理工具集成到go工具链中。

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

此外,分层依赖可能会导致docker映像很大。我建议尝试使用multi-stage builds,它可以帮助使图像超轻薄。

答案 3 :(得分:0)

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

  1. 转到您的GOROOT
  2. sudo rm -rf pkg/mod/
  3. 转到go.mod文件所在的目录
  4. go mod download