如何避免使用`go get`更新自己

时间:2014-05-15 16:03:04

标签: git go continuous-integration

我的包结构如下所示:

GOPATH
   src
      github.com/myname
         mymainproject
            something.go //imports things from github
            mysubproject
               main.go //imports "github.com/myname/mymainproject" + others

作为m build的一部分,我从主目录运行go get -u -t ./..。如果从master构建,这很有用,但是我将jenkins配置为从任何分支构建。

当从另一个分支构建时,当它更新mysubproject的依赖关系时,它会将完整的工作目录更新为master,这绝不是我想要的。

我只有两个可能有用的真实想法:

  1. 运行go get后,查看我要构建的原始分支。我仍然担心在go-get中切换分支可能会导致它跳过仅存在于分支中的某些依赖项,或者获取仅存在于master中的不必要的依赖项,因此我不确定这是一个很好的解决方案。
  2. 使用魔术go1标记标记分支上的当前提交。我相信这也必须在遥控器上完成,这使它不那么吸引人了。
  3. 有没有办法阻止go-get触及我的主存储库?

2 个答案:

答案 0 :(得分:3)

虽然我不建议将go get -u作为生产版本的一部分(例如Google,我建议您销售您的软件包,以便您可以重现旧版本并管理分支机构上的软件包版本控制),但这并不难获得你想要一个使用list的小脚本和一些过滤。这样的事情应该有效:

go get -u -t `go list ./... | grep -v mysubproject`

这将排除mysubproject。或者您可以排除mymainproject,或以其他方式过滤以删除您不想更新的任何内容。

您还应该查看godep以帮助您管理依赖项并在需要时更新它们。


更新:您可以将此更改为其他级别,并明确列出您导入的所有软件包:

go list -f '{{join .Imports "\n"}}' github.com/mymainproject/mysubproject | sort -u

这列出了mysubproject直接导入的所有内容。您可以过滤掉mymainproject,然后更新该列表(不包括mysubproject或mymainproject)。这也包括系统包,但是那些不会更新,所以没关系(尽管你可以根据需要过滤它们)。 / p>

Godep目前正在添加一个-r选项,该选项将重写导入,因此您可以将依赖项提供给树,并将其导入为github.com/mymainproject/mysubproject/Godeps/_workspace/src/github.com/<package>。这是在rewrite分支上。这种方法的优点在于它意味着您的库使用您测试的版本,而不是最终消费者机器上的任何版本。缺点是最终消费者最终可能会使用相同包装的多个副本。

你应该总是花些时间来问自己,你真的是否需要你的库中的依赖。传递依赖性似乎永无止境的问题就像这些。你可以解决它们,你应该找一个对你来说非常重要的依赖,但是我不止一次拿起我实际需要的两个函数并将它们复制到我的包中以避免依赖。我不是说重用代码很糟糕;在每种情况下确保成本都是值得的。

答案 1 :(得分:0)

似乎对我有用的是不要像Rob建议的那样使用go get -u。相反,我确保在构建之前完全清理我的gopath。然后我可以简单地执行go get -t ./...来获取磁盘上尚未存在的所有依赖项。

这需要lokger来获取所有依赖项,但它运行良好。