成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

簡潔的 Go 多版本管理機制

開發 后端
本文介紹了 Go 官方提供的多版本管理方案,包括使用、安裝、卸載等,可以感受到它的簡潔與高效。同時我們簡單查看了這一套實現代碼邏輯。

[[440441]]

本文轉載自微信公眾號「Golang技術分享」,作者機器鈴砍菜刀。轉載本文請聯系Golang技術分享公眾號。

一門充滿生機的編程語言,一定是不斷進化向前的。隨著 Go 項目的持續發展,它目前已經發布到了 1.17 大版本,而且每個大版本內還會有不少小版本的迭代。對于 Go 的版本更新,我們該如何做好多版本管理。

多版本管理的重要性

這里簡單列舉幾個我們需要 Go 多版本管理的理由。

  • 穩定性考量:雖然 Go1 一直在良好地遵守向后兼容準則,但通常基于穩定性考慮,我們并不會直接升級到最新版本。
  • 多項目開發:各項目依賴的 Go 版本不一致。
  • 版本兼容:測試代碼前后兼容性,或者確保 bug 修復在不同 Go 版本的正確性,對于開源項目,保證版本兼容性非常重要。
  • 學習新特性:例如雖然我們還在使用 Go 1.16 開發,但是并這不能阻礙你嘗鮮 Go 1.17 新功能。

如何多版本管理

我們需要有兩個先決條件

  • 已經安裝好了某版本的 Go
  • 安裝好了 git

安裝

運行go get golang.org/dl/go 命令將下載特定 Go 版本的包裝器。

  1. $ go install golang.org/dl/go<version>@latest 

通過包裝器,下載特定 Go 版本和它對應的工具鏈。

  1. $ go download 

例如安裝1.14.12版本,可以這樣執行。

  1. $ go install golang.org/dl/go1.14.12@latest 
  2. $ go1.14.12 download 

使用

使用包裝器 go1.14.12,我們可以基于 Go v1.14.12 進行構建和測試。

  1. $ go1.14.12 mod init hello 
  2. go: creating new go.mod: module hello 
  3. $ echo 'package main; import "fmt"; func main() { fmt.Println("Hello, World") }' > hello.go 
  4. $ go1.14.12 build 
  5. $ ./hello 
  6. Hello, World 

當然,如果你想讓 Go v1.14.12 ”喧賓奪主“,成為 go 命令的代言人,可以這樣做。

  1. $ go version 
  2. go version go1.17 darwin/amd64 
  3. $ export GOROOT=$(go1.14.12 env GOROOT) 
  4. $ export PATH=${GOROOT}/bin:$PATH 
  5. $ go version 
  6. go version go1.14.12 darwin/amd64 

這個go1.14.12 env GOROOT 路徑就是 Go v1.14.12 版本的內容。所以,如果我們想卸載這個版本,直接將該路徑文件夾刪除即可;想閱讀該版本源碼,直接查看該路徑下的src/內容即可 。

獲取最新開發版本

有一個特別的版本標記:gotip,它用于安裝最新的開發版本。

  1. $ go install golang.org/dl/gotip@latest 
  2.  
  3. $ gotip download 

可以看到,當前拉取到的最新的開發版本是 go1.18-1afa432。

實現思路

實現多版本下載安裝的秘訣就在于 https://go.googlesource.com/dl 這個倉庫,https://github.com/golang/dl 是它的鏡像庫。

查看倉庫代碼,我們能看到一系列版本目錄

隨意選擇一個版本進入,會發現存在一個 main.go 文件

而 main.go 文件內容如下

我們通過go install golang.org/dl/go1.14.12@latest下載的 go1.14.12 包裝器就是這個 main.go 編譯而成。

因此,我們后續通過 go1.14.12 包裝器下載和運行的邏輯就在于internal/version包中的 Run 方法了。

  1. // Run runs the "go" tool of the provided Go version. 
  2. func Run(version string) { 
  3.  log.SetFlags(0) 
  4.   // 獲取 Go 安裝目錄 
  5.  root, err := goroot(version) 
  6.  if err != nil { 
  7.   log.Fatalf("%s: %v", version, err) 
  8.  } 
  9.    
  10.   // 執行 go<version> download 命令時邏輯 
  11.  if len(os.Args) == 2 && os.Args[1] == "download" { 
  12.   if err := install(root, version); err != nil { 
  13.    log.Fatalf("%s: download failed: %v", version, err) 
  14.   } 
  15.   os.Exit(0) 
  16.  } 
  17.    
  18.   // 判斷該版本 Go 安裝狀態 
  19.  if _, err := os.Stat(filepath.Join(root, unpackedOkay)); err != nil { 
  20.   log.Fatalf("%s: not downloaded. Run '%s download' to install to %v", version, version, root) 
  21.  } 
  22.   // 運行該版本 Go 
  23.  runGo(root) 

鑒于篇幅原因, 下載的install和運行的runGo函數邏輯本文就不再展開了,想深入了解的同學可以自行探索。

另外,為了讓每個版本都有一個 Go 包裝器主程序(避免重復的手工操作),這里使用了一個幫助命令genv:可以快速生成對應版本的包裝器代碼/main.go。這里的實現見internal/genv/main.go代碼。

總結

本文介紹了 Go 官方提供的多版本管理方案,包括使用、安裝、卸載等,可以感受到它的簡潔與高效。同時我們簡單查看了這一套實現代碼邏輯。

最后,希望本文內容能夠助你用好 Go 多版本管理,歡迎留言討論。

 

責任編輯:武曉燕 來源: Golang技術分享
相關推薦

2010-12-10 15:40:58

JVM內存管理

2016-09-06 22:05:41

HttpCookieWeb

2009-07-08 15:10:00

Servlet會話管理

2010-07-23 09:34:48

Python

2013-09-29 15:11:46

Linux運維內存管理

2022-06-01 16:01:58

MySQL內存管理系統

2010-09-26 13:23:13

JVM內存管理機制

2009-09-25 12:59:53

Hibernate事務

2010-04-08 15:43:28

Oracle緩沖塊

2011-06-29 17:20:20

Qt 內存 QOBJECT

2009-09-23 17:48:00

Hibernate事務

2016-10-09 14:41:40

Swift開發ARC

2022-02-28 10:25:17

Python參數傳遞拷貝

2020-11-08 14:32:01

JavaScript變量內存管理

2011-11-10 14:46:54

Windows8電源管理

2010-09-27 13:26:31

JVM內存管理機制

2017-08-17 17:09:28

PostgreSQL 數據塊機制

2019-01-23 17:08:52

Python內存管理RealPython

2020-08-18 19:15:44

Redis內存管理

2011-08-18 13:28:35

Objective-C內存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费成人高清 | 亚洲一区综合 | 97伦理电影网 | 日韩精品久久久久 | 午夜精品久久久久久久久久久久久 | 亚洲成人自拍 | 亚洲精品久久久久久下一站 | 91精品久久久久久久久 | 日本在线中文 | 在线观看免费av片 | 男女午夜激情视频 | 亚洲国产一区二区视频 | 日本色婷婷 | 一级毛片视频免费观看 | jlzzjlzz欧美大全 | 欧美亚洲视频在线观看 | 亚洲欧洲精品在线 | 综合一区二区三区 | 亚洲欧美日韩精品久久亚洲区 | 在线播放国产一区二区三区 | 亚洲成人自拍 | 亚洲综合五月天婷婷 | 欧美精品在线一区 | 国产精品精品3d动漫 | 日韩精品人成在线播放 | 成人精品一区二区三区中文字幕 | 欧美性猛交一区二区三区精品 | 中文字幕av在线 | 久久久久网站 | 久久在线看 | 亚洲人成人一区二区在线观看 | 成人在线视频免费观看 | 天天插天天搞 | 午夜爽爽爽男女免费观看影院 | 国产在线精品一区二区 | 亚洲国产福利视频 | 一级黄色片网站 | 亚洲国产一区二区三区, | 午夜影院黄 | 天天爽夜夜爽精品视频婷婷 | 亚洲欧洲精品一区 |