【问题标题】:Building a Go project: go mod download vs go build构建 Go 项目:go mod 下载与 go build
【发布时间】:2021-06-29 10:50:10
【问题描述】:

我是新手,正在尝试弄清楚如何在我的 circleci 项目中执行构建步骤。

我注意到在 CircleCI Go orb 中没有使用 go build,这让我感到困惑,因为在 CircleCI Go Language Guide 中,他们专门通过 makefile 使用 go build

所以我不确定单独使用 Go 球是否足够(尽管这对我来说似乎很奇怪)。我隐约明白go mod download 是做什么的,go build 是做什么的,但我见过examples 一起使用的地方:

RUN go mod download

COPY . .

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

目前,根据 go orb 使用文档,我有:

  build:
    executor: go
    steps:
      - checkout
      - go/load-cache:
          key: go-mod-v1-{{ checksum "go.sum" }}
      - go/mod-download
      - go/save-cache:
          key: go-mod-v1-{{ checksum "go.sum" }}
      - slack/notify:
          event: fail
          template: basic_fail_1   

通过使用go mod download 而不是go buildgo buildgo mod download,我遗漏了什么或无意包含了什么?

【问题讨论】:

  • 你测试了吗?输出结果如何不符合您的预期?
  • 在构建 CI/CD 设置中执行 go mod download 的好处是,如果 go mod download 失败,您有一个单独的步骤失败,并且很明显(呃)您的构建管道有问题findingaccessing 依赖项,而不是编译您的代码(或依赖项的代码)。这有助于更快地发现问题(例如使用私人回购)。

标签: go build circleci go-modules


【解决方案1】:

go mod download 的文档详细说明了所有依赖项都将被下载,因为没有提供任何参数。

不带参数,下载适用于 main 的所有依赖项 模块。

问题中的行似乎是 CI 作业完整说明的子集。 Circle CI documentation 中的示例建议了一个构建步骤,这是获取可执行文件所必需的。

任何build 命令都允许选择与依赖相关的行为。正如建议的那样,拥有一个单独的go mod download 取决于环境的限制。

【讨论】:

    【解决方案2】:

    go mod download 下载所有依赖模块的源代码,并验证新下载模块的校验和。 (请注意,在 Go 1.18 中,我们 plan to change go mod download 的行为,因此它可以只下载在主模块中构建包和测试所需的模块。)

    go build 构建包。它会根据需要自动下载(并验证)模块源代码以构建这些包。在许多情况下,这比go mod download 下载的模块集要小得多。

    【讨论】:

    • 我不确定为什么 CircleCI 会使用 go mod download 而不是 go buildgo 命令对构建的目标文件有一个单独的缓存,所以如果目标是加快构建速度,那么通过运行初始 go build 然后保存 both 模块缓存和构建缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    相关资源
    最近更新 更多