繁体   English   中英

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

[英]How to avoid updating myself with `go get`

我有一个看起来像这样的包结构:

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依赖关系时,它mysubproject完整的工作目录更新为master,这根本不是我想要的。

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

  1. 在我运行go get ,查看我想要构建的原始分支。 我仍然担心在go-get中切换分支可能会导致它跳过仅存在于分支中的某些依赖项,或者只获取仅存在于master中的不必要的依赖项,所以我不确定这是一个很好的解决方案。
  2. 使用magic go1标记标记分支上的当前提交。 我相信这也必须在遥控器上完成,这使它不那么吸引人了。

有没有办法防止go-get触及我的主存储库?

虽然我不建议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“。这也包括系统包,但是那些不会更新,所以没关系(尽管你可以根据需要过滤它们)。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM