繁体   English   中英

如何使用vgo和给定的go.mod下载所有依赖项?

[英]How to download all dependencies with vgo and a given go.mod?

我正在使用vgo和一个Dockerfile开展一个go项目,我希望docker能够缓存项目的依赖项,这样它就有两个属性:

  1. 如果go.mod文件发生更改,则将重新下载依赖项
  2. 如果我更改了包中的文件,但没有更改go.mod ,则不会重新下载依赖项。

现在,我这样做:

...
RUN go get -u golang.org/x/vgo
COPY . /go/src/whatever
RUN vgo install
...

但是如果你改变一个go文件,就必须从COPY层开始重建dockerfile。

简而言之,我想做的是:

...
RUN go get -u golang.org/x/vgo
COPY go.mod /go/src/whatever
RUN vgo install_dependencies
COPY . /go/src/whatever
RUN vgo install
...

这样,如果我更改go.mod ,将下载并重建所有依赖项,否则,我们可以继续构建二进制文件。

我可以看到几种方法来获得这样的行为,但所有这些方法都有缺点:

  1. 我可以将$GOPATH/src/mod复制$GOPATH/src/mod容器中,但是这将有很多我不需要的文件
  2. 我可以在构建vgo mod -vendor容器之前vgo mod -vendor ,并复制供应商目录,但这依赖于开发人员每次go.mod更改时都记得运行vgo mod -vendor ,否则应用程序将无法构建并且他们在重试vgo mod -vendor之前,必须运行vgo mod -vendor

你能想到一种方法让我获得像我想象中的vgo install_dependencies这样的行为吗? 我错过了一个vgo技巧吗?

tl; dr:在当前go master和将来的go版本中, go mod download将完成这项工作。 现在你需要一个黑客。

关于gophers松弛,我被提到这个问题: https//github.com/golang/go/issues/26610我在那里了解到这会或多或少地做我想要的(假设你在使用go版本) 1.11beta3):

# Populate the module cache based on the go.{mod,sum} files.
COPY go.mod .
COPY go.sum .
RUN go list -e $(go list -f '{{.Path}}' -m all)

在线程的后期,Russ Cox实现了go mod download ,将在下一个版本的go ,允许我删除上面的愚蠢的go list

更新: go mod download现已广泛使用,您应该在1.12及更高版本中使用它

我有一个完全相同的问题,想让Docker缓存更准确。

所以我刚刚为此编写了自己的工具: https//github.com/gladkikhartem/gomodget

现在我的docker-in-docker管道只有10秒,而docker build日志看起来像这样:

Step 4/15 : RUN go get -u golang.org/x/vgo
 ---> Using cache
 ---> 12c672a07a16
Step 5/15 : RUN go get github.com/gladkikhartem/gomodget
 ---> Using cache
 ---> acc70fea0edc
Step 7/15 : COPY go.mod .
 ---> Using cache
 ---> 41bae1ca7428
Step 8/15 : RUN gomodget
 ---> Using cache
 ---> 758100f7dde2
Step 9/15 : COPY . .
 ---> cc833c5bc810
Step 10/15 : RUN vgo build -ldflags '-extldflags "-static"' -o /bin/app 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM