簡體   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