我正在使用带有模块支持的go 1.11。我知道go工具现在可以在构建/安装时自动安装依赖项。我也了解原因。
我正在使用docker构建我的二进制文件。在许多其他生态系统中,通常会复制依赖项清单(package.json,requirements.txt等)并将依赖项作为独立于构建的阶段进行安装。这利用了docker的层缓存,并使得重建速度大大加快,因为通常代码更改远远超过依赖项更改。
我想知道vgo有什么办法吗?
答案 0 :(得分:6)
您可以使用go mod vendor
命令,该命令将在主模块的根文件夹中创建一个vendor
文件夹,并将所有依赖项复制到其中。之后,您可以将-mod=vendor
参数传递给go工具,然后使用vendor
文件夹中的依赖项来构建/编译/测试您的应用。
因此,您可以采取哪些措施来加快构建速度:
go mod vendor
命令以获取依赖项的实际版本。vendor
文件夹。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)
您可以使用包管理器,其中有许多类似dep,glide和govendor。 dep
较新,将作为正式的依赖管理工具集成到go工具链中。
我们还为go应用程序制作了docker映像,并使用dind制作了这些映像,并准备了一个CI / CD映像,其中预先安装了所有依赖项,以加快构建速度。不过,将所有内容粘合在一起需要一些脚本。
此外,分层依赖可能会导致docker映像很大。我建议尝试使用multi-stage builds,它可以帮助使图像超轻薄。
答案 3 :(得分:0)
我想使用go mod
重新下载所有依赖项,这就是我所做的:
GOROOT
sudo rm -rf pkg/mod/
go.mod
文件所在的目录go mod download