首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何下载vgo和给定go.mod的所有依赖项?

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

Stack Overflow用户
提问于 2018-07-01 19:26:49
回答 2查看 8.6K关注 0票数 9

我正在使用一个Dockerfile使用vgo处理一个go项目,我希望docker能够缓存该项目的依赖项,使其具有两个属性:

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

现在,我知道:

代码语言:javascript
复制
...
RUN go get -u golang.org/x/vgo
COPY . /go/src/whatever
RUN vgo install
...

但是,如果您更改了go文件,那么必须从COPY层开始重新构建dockerfile。

简而言之,我想做的是:

代码语言:javascript
复制
...
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复制到码头容器中,但这将有很多我不需要的文件
  2. 我可以在构建docker容器之前复制vgo mod -vendor,并复制供应商目录,但这依赖于开发人员在每次go.mod更改时记住运行vgo mod -vendor,否则应用程序将不会生成,并且在重新尝试go.mod构建之前必须运行vgo mod -vendor

你能想出一种让我像想象中的vgo install_dependencies那样表现的方法吗?我是不是错过了一个vgo技巧来做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-08 02:33:03

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

在gophers松弛的情况下,我被推荐到这个问题:https://github.com/golang/go/issues/26610,在这里,我了解到这或多或少会做我想做的事情(假设这里使用的是go版本1.11beta3):

代码语言:javascript
复制
# 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实现了go mod download,它将在go的下一个版本中使用,允许我删除上述愚蠢的go list攻击。

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

票数 9
EN

Stack Overflow用户

发布于 2018-08-07 10:00:38

我也有同样的问题,想让Docker缓存更准确。

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

现在,我的对接管道只有10秒,码头构建日志如下所示:

代码语言:javascript
复制
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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51126349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档