【问题标题】:Reproducible releases with go dependent packages带有 go 依赖包的可重现版本
【发布时间】:2012-04-07 17:15:58
【问题描述】:

我正在阅读“如何编写 Go 代码”教程,我不禁想知道如何建立一个稳定的工作流程。

我的代码自然会受到源代码控制,比如 Git。现在我希望能够做到以下几点:

  • 构建我的项目的可执行文件 - 并确保对于给定的 Git 版本,可执行文件将构建相同的版本。
  • 为我的项目运行连续构建,以便在每次提交时激活。我需要确保持续构建所做的任何事情都可以在我的工作站上重现。
  • 创建我的项目的版本。我需要知道,如果我从我的代码的相同 git 版本再次执行该版本,则可以重新创建一个版本。

Go 为它提供了“go get”工具——但这就是我感到困惑的地方。应该支持这一点的工具“go get”设置了依赖包的源代码控制仓库。这给了我以下问题:

  1. 我无法将依赖包置于我自己的源代码管理之下。这意味着,如果我和我的合作者,或者我和我的持续构建系统之间存在任何环境差异,我们将很难找出这些差异。
  2. 如果网络中断,我将无法从头开始构建我的代码。或者,换一种说法,我的持续构建系统每次构建发布时都必须访问所有这些外部服务器。这可能很脆弱,甚至我都不愿意让外界知道。
  3. Go 定义了将包版本与基础语言同步的约定,但不能保证包作者会遵循该约定。如果他们不这样做,一个干净的工作区会选择一个可能被破坏的任意版本。
  4. 如果我依赖的项目被放弃,我可能会失去构建程序的能力。

我可以通过手动导入依赖项目的代码而不使用“go get”来解决这些问题 - 但是,我避免使用专门为该用途设计和推广的工具。

有什么建议吗?我错过了什么吗?

【问题讨论】:

    标签: continuous-integration go packaging release-management


    【解决方案1】:

    go get 只使用源代码库使用的分布式版本控制系统。它将使用 repo 的本地副本。我将尝试在这里解决您的每一个问题。

    1. 您当然可以在本地 repo 中进行修改并在那里提交,如果您 想要。
    2. go get 使用它首先构建的本地存储库,除非您明确告诉它更新。
    3. go get 不会炸毁它仍然存在的存储库。而且由于所有的来源 go get 理解的控制系统是分布式源代码控制系统,没有 原因是您不能自己保持项目的一个分支。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多