我正在使用1.11模块支持.我知道go工具现在会在构建/安装时自动安装依赖项.我也理解这个推理.
我正在使用docker构建我的二进制文件.在许多其他生态系统中,通常会复制依赖关系清单(package.json,requirements.txt等)并将依赖关系作为构建的单独阶段进行安装.这利用了docker的层缓存,并且使得重建速度更快,因为通常代码更改的数量远远超过依赖项更改.
我想知道vgo有没有办法做到这一点?
rus*_*tyx 41
这是一个问题#26610,现在已修复。
所以现在你可以使用:
go mod download
Run Code Online (Sandbox Code Playgroud)
为此,您只需要go.mod/go.sum文件。
例如,以下是缓存多阶段 Docker 构建的方法:
FROM golang:1.16-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"]
Run Code Online (Sandbox Code Playgroud)
另请参阅本文容器化您的 Go 开发人员环境 – 第 2 部分,其中描述了如何利用 Go 的编译器缓存进一步加快构建速度。
icz*_*cza 10
您可以使用go mod vendor将vendor在主模块的根文件夹中创建文件夹的命令,并将所有依赖项复制到其中.在此之后,您可以将-mod=vendorparam 传递给go工具,然后来自该vendor文件夹的依赖项将用于构建/编译/测试您的应用程序.
那么你可以做些什么来加速你的构建:
go mod vendor命令以获得依赖项的实际版本.vendor文件夹.vendor文件夹,并通过将-mod=vendor参数传递给go工具来构建/安装应用程序,因此不会下载任何依赖项,但vendor将使用该文件夹的内容.引用自go help mod:
模块和销售
使用模块时,go命令完全忽略供应商目录.
默认情况下,go命令通过从其源下载模块并使用下载的副本来满足依赖性(在验证之后,如上一节中所述).为了允许与旧版本的Go进行互操作,或者为了确保用于构建的所有文件一起存储在单个文件树中,'go mod vendor'在主模块的根目录中创建一个名为vendor的目录并存储在那里来自依赖模块的包,这些包是支持主模块中包的构建和测试所需的.
要使用主模块的顶级供应商目录来构建以满足依赖性(禁用常用网络源和本地缓存),请使用"go build -mod = vendor".请注意,仅使用主模块的顶级供应商目录; 其他位置的供应商目录仍被忽略.