是否从go.mod手动获取依赖项?

是否从go.mod手动获取依赖项?,go,go-modules,Go,Go Modules,我正在使用go 1.11和模块支持。我知道go工具现在会在构建/安装时自动安装依赖项。我也理解其中的道理 我正在使用docker构建我的二进制文件。在许多其他生态系统中,复制依赖项清单(package.json、requirements.txt等)并将依赖项作为构建的单独阶段安装是很常见的。这利用了docker的层缓存,并且使得重建速度更快,因为通常代码更改的数量远远超过依赖项更改的数量 我想知道vgo是否有办法做到这一点?您可以使用包管理器,其中有许多类似的,和dep较新,将作为官方依赖项管理

我正在使用go 1.11和模块支持。我知道go工具现在会在构建/安装时自动安装依赖项。我也理解其中的道理

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


我想知道vgo是否有办法做到这一点?

您可以使用包管理器,其中有许多类似的,和
dep
较新,将作为官方依赖项管理工具集成到go工具链中

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


此外,将依赖项分层可能会导致docker图像的大尺寸。我建议尝试一下有助于使图像超级精简的方法。

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

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

  • 运行
    go mod vendor
    命令以获得依赖项的实际版本
  • 保存/缓存此
    供应商
    文件夹
  • 在构建过程中,还原此
    供应商
    文件夹,并通过将
    -mod=vendor
    参数传递到go工具来构建/安装您的应用程序,因此不会下载依赖项,但将使用
    供应商
    文件夹的内容
  • 转到帮助模块
    中引用:

    模块与供应商

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

    默认情况下,go命令通过下载模块来满足依赖关系 从其来源并使用下载的副本(经核实, 如前一节所述)。允许与较旧的 Go的版本,或确保存储用于生成的所有文件 在单个文件树中,“go mod vendor”一起创建一个名为 供应商位于主模块的根目录中,并将所有 来自依赖模块的包,这些包是支持构建和 主模块中的软件包测试

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

    这是一个问题,现在已经解决了

    因此,现在您可以使用:

    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"]
    

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

  • 转到您的
    GOROOT
  • sudo-rm-rf-pkg/mod/
  • 转到存在
    Go.mod
    文件的目录
  • go mod下载

  • 这更多的是一个问题,1.11版本的新系统是否有一个内置的方法来实现这一点。如果你查看dep repo,你会发现它实际上已经被弃用于模块:(这不只是
    go mod download
    ?它是否在/go/bin中安装了该软件包?