任何一門編程語言都離不開對各種工具包的使用,工具包的管理就顯得例外重要了,Go 的包管理方式是逐漸演進的,本文介紹Go語言的兩種包管理模式,
GOPATH模式引包(不推薦)
在 1.5 版本之前,所有的依賴包都是存放在 GOPATH 下,沒有多版本控制,
go的編譯器會在 $GOPATH/src 下面尋找對應的模塊,src 下的每一個目錄都可以對應一個模塊,目錄中的目錄也可以是一個模塊
下面展示如何在入口檔案main.go 里引入非標準庫model包中的變數
- 目錄層級如下
├───main
│ main.go
└───model
utils.go
-
main/main.go入口檔案引入utils里面的Name變數 -
model/utils.go檔案宣告package model,并定義變數var Name string = "xiao",變數必須是大寫,否則報錯name not exported by package model
- main.go 檔案引model包
package main
import (
"fmt"
// 引包
// 省略GOPATH/src, Go編譯的時候會自動在src目錄下尋找
"go_code/pointer/model"
)
func main() {
fmt.Println(model.Name) // xiao
}
開啟GO111MODULE后非module專案產生的問題
在GO111MODULE=on,并且已經設定GOPATH的條件下,寫的代碼在$GOPATH/src下,我想要使用另一個package里面的內容,并且這個package不是標準庫,或者說不在GOROOT里(一般我們不會修改GOROOT中的內容),編譯會報錯,如下????
package go_code/pointer/model is not in GOROOT

解決方法一:
設定GO111MODULE=off
go env -w GO111MODULE=off
設定完之后, go env查看
然后重新編譯即可
解決方法二
使用go mod , 請看下文介紹??
GO MODULE 模式引包(推薦)
go module 介紹
go modules 是 golang 1.11 新加的特性,
模塊是相關Go包的集合
modules是源代碼交換和版本控制的單元
go命令直接支持使用modules,包括記錄和決議對其他模塊的依賴性,modules替換舊的基于GOPATH的方法來指定在給定構建中使用哪些源檔案,
GO111MODULE 有三個值:off, on和auto(默認值),
-
GO111MODULE=off,go命令列將不會支持module功能,尋找依賴包的方式將會沿用舊版本那種通過vendor目錄或者GOPATH模式來查找(也就是本文最開始介紹的方式),
-
GO111MODULE=on,go命令列會使用modules,不會去GOPATH目錄下查找所參考的包,
-
GO111MODULE=auto,默認值,go命令列將會根據當前目錄來決定是否啟用module功能,這種情況下可以分為兩種情形:
-
當前目錄在
GOPATH/src之外且該目錄包含go.mod檔案 -
當前檔案在包含go.mod檔案的目錄下面,
-
當modules功能啟用時,依賴包的存放位置變更為
$GOPATH/pkg,允許同一個package多個版本并存,且多個專案可以共享快取的module

利用GO111MODULE和GOPROXY,可以直接將Github上的第三方庫直接下載到本地使用,不需要使用go get命令,執行 go run 運行時,GOMODULES包管理工具會自動幫我們下載github上面的包
使用 go mod 創建新專案
當開啟GO111MODULE的時候,才可以使用go mod
1、初始化專案
mkdir test-mod
cd test-moe
go mod init maze-mod
在專案根目錄生成 go.mod 檔案
module test-mod
go 1.17
require github.com/astaxie/beego v1.12.1
require (
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 // indirect
golang.org/x/text v0.3.0 // indirect
)
注意:
有
indirect注釋的代表間接依賴,沒有的代表直接依賴,前面是版本號+時間戳+hash(如:
v0.0.0-20190620200207-3b0461eec859)
-
go.mod檔案一旦創建后,它的內容將會被go toolchain全面掌控,go toolchain會在各類命令執行時(比如go get、go build、go mod等),修改維護go.mod檔案, -
go.mod提供了module, require、replace和exclude 四個命令-
module 陳述句指定包的名字(路徑)
-
require 陳述句指定的依賴項模塊
-
replace 陳述句可以替換依賴項模塊
-
exclude 陳述句可以忽略依賴項模塊
-
2、添加依賴
-
新建
main.go檔案 -
執行
go run main.go-
一般來說
go mod模式下,運行go run會自動安裝所有依賴,但是沒有安裝 -
運行
go get ./ ...可以自動查找并下載安裝所有的包 -
運行
go get package@version安裝指定版本的依賴包
-
3、查看依賴
-
go list -m all查看當前模塊所依賴的包串列 -
go mod tidy從go.mod中移除不需要的依賴
4、go.sum檔案
用來做包版本管理
go.sum檔案與go.mod檔案同級,go.sum檔案是對匯入的依賴包的特定版本的hash校驗值,作用就是記錄第一次下載的依賴版本號,防止有依賴版本升級帶來的不兼容問題,所以,go.mod和go.sum檔案都需要被加入版本管理中,
總結
-
GOPATH模式是 go在 1.5 版本之前的包管理模式,不具備版本控制功能,且所有專案的依賴都放在 GOPATH 里面,管理比較混亂 -
GO MODULE模式是go在1.11 版本推出的,使用git的管理方式,直接從GitHub上下載所需要的依賴,可能會存在一些安全性問題,同時國內需要設定GOPROXY代理服務器才可使用,相對來說好用一點,
包管理模式一直是各個開發語言所面臨的棘手問題,比如NPM和Yarn,設計一種完美的包管理模式還需要不斷探索實踐,

我是 甜點cc
熱愛前端開發,也喜歡專研各種跟本職作業關系不大的技術,技術、產品興趣廣泛且濃厚,本號主要致力于分享個人經驗總結,希望可以給一小部分人一些微小幫助,
希望能和大家一起努力營造一個良好的學習氛圍,為了個人和家庭、為了我國的互聯網物聯網技術、數字化轉型、數字經濟發展做一點點貢獻,數風流人物還看中國、看今朝、看你我,
本文來自博客園,作者:甜點cc,轉載請注明原文鏈接:https://www.cnblogs.com/all-smile/p/16869315.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/529824.html
標籤:Go
下一篇:狂神說Go語言筆記—Go基礎語法
