Go語言:包管理基礎知識

Hang,發表於2022-01-20

起因是,遇到一個問題:

image-20220120165012429

經查閱資料,很可能跟包管理有關,之前有了解過忘了就再學一遍順便解決問題。

學習資料:

所謂包管理,比如軟體包管理,方便進行軟體安裝,升級,解除安裝等一些操作;

Go語言程式中經常會引入其他的package來使用;

Go語言剛開始是並沒有包管理相關功能,實現import <packages>時:

  • 我理解是:早期需要啥包,就手動go get什麼。
  • go get 命令:會根據路徑,把相應的模組獲取並儲存在$GOPATH/src

Go Modules

Go 1.11 引入Go Modules後:

  • GO111MODULE = off:強制使用GOPATH 方式;
  • GO111MODULE = on:強制使用Go Modules
  • GO111MODULE = auto:
    • 當存在 go.mod 檔案時或處於 GOPATH 外, 相當於 GO111MODULE=on。
    • 相當於 Go 1.13 下你可以將所有的程式碼倉庫均不儲存在 GOPATH 下。
    • 當專案目錄處於 $GOPATH 內,且沒有 go.mod 檔案存在時,相當於 GO111MODULE=off。
  • 使用 Go Modules 時,在 go build 期間使用的包儲存在 $GOPATH/pkg/mod 中(而不是GOPATH的$GOPATH/src中)。
  • 執行 go run xxx.go 執行程式碼會發現 go mod 會自動查詢依賴自動下載。

到這以後,會考慮到go.mod這個從哪裡來,是自己手動建立麼?接著學習go mod;

go mod命令

Go mod 命令是實現Go Modules的工具;就相當於go getGOPATH的關係;

go mod 命令引數:

image-20220120170844146

圖片來源:go mod使用 - 簡書 (jianshu.com);常用的是 init,tidy, edit

初始化一個專案;

go mod init xxx

xxx與package名字無關;只是給當前專案用的模組(modules)一個名字;

go.mod檔案一旦建立後,它的內容將會被go toolchain全面掌控。go toolchain會在各類命令執行時,比如go get、go build、go mod等修改和維護go.mod檔案。

同時還生成了go.sum 其中包含軟體包的雜湊值,以確保我們具有正確的版本和檔案。

go.mod 提供了module, require、replace和exclude 四個go.mod內的關鍵字:

  • module 語句指定包的名字(路徑)
  • require 語句指定的依賴項模組
  • replace 語句可以替換依賴項模組
  • exclude 語句可以忽略依賴項模組

解決問題

1 確認GO111MODULE=on:確認了無數次,不僅zsh裡配置了,bash裡面也配置了;

但用go list是,依舊出現瞭如下報錯,配置的GO111MOUDLE=on未生效。

image-20220120204743960

go env -w GO111MODULE=on

這樣之後就好了。

所以我就有一個疑問了,為什麼bash配置檔案中新增的GO111MODULE=on 沒生效?

macos,我只用zsh,zshrc中新增了,也source了;甚至bash_profile,profile也都新增了;為什麼go env中還需要再設定一遍?很奇怪!

相關文章