91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go的modules怎么使用

發布時間:2022-04-22 13:50:34 來源:億速云 閱讀:134 作者:iii 欄目:開發技術

本篇內容主要講解“go的modules怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“go的modules怎么使用”吧!

    1.go modules的基本介紹

    1.1 提供的命令

    在go環境的shell中執行go mod help查看命令和說明。

    Usage:
    
            go mod <command> [arguments]
    
    The commands are:
    
            download    download modules to local cache
            edit        edit go.mod from tools or scripts
            graph       print module requirement graph
            init        initialize new module in current directory
            tidy        add missing and remove unused modules
            vendor      make vendored copy of dependencies
            verify      verify dependencies have expected content
            why         explain why packages or modules are needed

    1.2 提供的環境變量

    go env查看go的環境變量,在所有go提供的環境變量中,有一個是和go mod相關的。

    GO111MODULE="on"
    GOPROXY="https://goproxy.cn,direct"
    GONOPROXY="git.example.com,x1"
    GONOSUMDB="git.example.com,x1"
    GOPATH="/home/go-project/"
    GOPRIVATE="git.example.com,x1"
    GOSUMDB="sum.golang.org"
    # 省略其余環境變量...
    1.2.1 說明

    1) GO111MODULE

    go語言提供GO111MODULE環境變量三個值,用于GO111MODULE的開關:

    • auto:只要項目中包含了go.mod這個文件,就啟動該項目的go modules,在 Go1.11 至 Go1.14 中仍然是默認值。

    • on:啟動go modules

    • off:關閉go modules

    2) GOPROXY

    go env中默認的代理是GOPROXY="https://proxy.golang.org,direct",但是在國內是無法訪問的,這里需要設置成國內的代理地址GOPROXY="https://goproxy.cn,direct"

    GOPROXY的值是一個以英文逗號 “,” 分割的 Go 模塊代理列表,允許設置多個模塊代理,假設你不想使用,也可以將其設置為 “off” ,這將會禁止 Go 在后續操作中使用任何 Go 模塊代理。

    direct

    實際上 “direct” 是一個特殊指示符,用于指示 Go 回源到模塊版本的源地址去抓取(比如 GitHub 等),場景如下:當值列表中上一個 Go 模塊代理返回 404 或 410 錯誤時,Go 自動嘗試列表中的下一個,遇見 “direct” 時回源,也就是回到源地址去抓取,而遇見 EOF 時終止并拋出類似 “invalid version: unknown revision&hellip;” 的錯誤。

    在cmd中執行set GO111MODULE=on

    go的modules怎么使用

    3)GONOPROXY/GONOSUMDB/GOPRIVATE

    這三個環境變量都是用在當前項目依賴了私有模塊,例如像是你公司的私有 git 倉庫,又或是 github 中的私有庫,都是屬于私有模塊,都是要進行設置的,否則會拉取失敗。對于一些自己的私有模塊代碼,需要在GOPRIVATE上設置,在拉取時會提示輸入用戶名和密碼。

    可以設置多個,用英文的逗號分隔開;或者用通配符等

    go env -w GOPRIVATE="git.example.com,github.com/eddycjy/mquote"
    go env -w GOPRIVATE="*.example.com"	# 通配example.com的域名

    2.go modules的基本使用

    開啟go modules后,就可以創建項目并且生成mod文件,來管理項目的所有依賴了。以下是go env環境的配置:

    GO111MODULE="auto"
    GOARCH="amd64"
    GOBIN="/go/bin/"
    GOCACHE="/root/.cache/go-build"
    GOENV="/root/.config/go/env"
    GOEXE=""
    GOFLAGS=""
    GOHOSTARCH="amd64"
    GOHOSTOS="linux"
    GOINSECURE=""
    GONOPROXY=""
    GONOSUMDB=""
    GOOS="linux"
    GOPATH="/home/go-project/"
    GOPRIVATE=""
    GOPROXY="https://goproxy.cn,direct"
    GOROOT="/go"
    GOSUMDB="sum.golang.org"
    GOTMPDIR=""
    GOTOOLDIR="/go/pkg/tool/linux_amd64"
    GCCGO="gccgo"
    AR="ar"
    CC="gcc"
    CXX="g++"
    CGO_ENABLED="1"
    GOMOD=""
    CGO_CFLAGS="-g -O2"
    CGO_CPPFLAGS=""
    CGO_CXXFLAGS="-g -O2"
    CGO_FFLAGS="-g -O2"
    CGO_LDFLAGS="-g -O2"
    PKG_CONFIG="pkg-config"
    GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build940953411=/tmp/go-build -gno-record-gcc-switches"

    設置了GOPATH/home/go-project/,并且代理指向了國內的代理地址,防止國外鏡像無法訪問的情況。

    2.1 初始化項目

    $GOPATH目錄下創建一個新的項目example.com/mycount/helloexample.com模擬github.com,mycount模擬賬號,hello是最終的項目名稱。目錄和文件結構:

    go的modules怎么使用

    2.1.1 初始化.mod文件

    hello目錄下執行go mod init example.com/mycount/hello初始化hello項目的mod文件,如下:

    go的modules怎么使用

    執行完初始化操作后生成了一個go.mod的文件,里面只記錄了2行:

    go的modules怎么使用

    • module:用于定義當前項目的模塊路徑

    • go:用于標識當前模塊的 Go 語言版本,值為初始化模塊時的版本,目前來看還只是個標識作用

    2.1.2 簡單一個示例

    hello目錄下寫一個main.go的文件,里面用了一個第三方的庫。

    package main
    
    import (
    	"net/http"
    
    	"github.com/gin-gonic/gin"
    	"github.com/json-iterator/go"
    )
    
    type resp struct {
    	Status  int    `json:"status"`
    	Message string `json:"message"`
    }
    
    func main() {
    	router := gin.Default()
    	router.GET("/", hello())
    	if err := router.Run(":6060"); err != nil {
    		panic(err)
    	}
    }
    
    func hello() gin.HandlerFunc {
    	return func(context *gin.Context) {
    		strResp, _ := jsoniter.MarshalToString(resp{
    			Status:  http.StatusOK,
    			Message: "success",
    		})
    		context.String(http.StatusOK, strResp)
    	}
    }

    hello目錄下執行go get命令,拉取依賴庫:

    go的modules怎么使用

    拉取依賴之后生成了一個go.mod和go.sum文件,go.mod文件:

    go的modules怎么使用

    go.sum的內容:

    go的modules怎么使用

    同時在$GOPATH目錄下多了一個pkg文件,里面有拉取的文件依賴。這個文件是一個全局的緩存,

    2.1.3 go modules的go get

    在拉取項目依賴時,你會發現拉取的過程總共分為了三大步,分別是 finding(發現)、downloading(下載)以及 extracting(提取), 并且在拉取信息上一共分為了三段內容:

    go的modules怎么使用

    需要注意的是,所拉取版本的 commit 時間是以UTC時區為準,而并非本地時區,同時我們會發現我們 go get 命令所拉取到的版本是 v0.0.0,這是因為我們是直接執行 go get -u 獲取的,并沒有指定任何的版本信息,由 Go modules 自行按照內部規則進行選擇。

    go的modules怎么使用

    那么我想選擇具體版本應當如何執行呢,如下:

    go的modules怎么使用

    3.使用go mod發布自己的包

    3.1 發布公開的包

    公開的發布包無需修改go env中的一些環境變量,默認的環境變量即可

    3.1.1 包的實現

    假設我們有一個模塊需要提供給第三方使用,并且這個包是發布在了gittee上,假設我在gitee上得賬號是gitee.com\luciferofwg。我們后期會根據迭代或者功能維護版本,每當有更新或者升級的時候就發布最新的版本,版本遵循語義化版本定義。什么是語義化版本
    這個包中包含一個函數,用于打印一句話,如下所示:

    // hello.go
    package hello
    
    import "fmt"
    
    func SayHello()  {
    		fmt.Println("hello world")
    }

    在GOPATH下新建目錄hello,在命令行下進入hello目錄,執行go mod init來生成go mod文件,如下:

    go的modules怎么使用

    生成的包名為gitee.com/luciferofwg/hello,后期在引用這個包時就import 這個包名。
    hello倉庫提交到gitee上,完成發布包的第一個階段。

    3.1.2 包的發布

    經過上一步驟,在倉庫中就有了一個名為hello的公開倉庫,如下:

    go的modules怎么使用

    假如我們認為這個版本是穩定可靠的,這時候我們需要發布一個可以使用的版本,gitee發布的流程如下:
    點擊倉庫中右側的創建按鈕,在彈出的頁面中創建發行版本號,填寫完畢后點擊創建發行版本完成發布。

    圖1 創建發行版本

    go的modules怎么使用

    圖2 發行版本信息

    go的modules怎么使用

    圖3 已創建的發行版本

    go的modules怎么使用

    到此我們發行了一個版本為v1.0.4的版本。

    3.1.3 包的使用

    對于已經發行的包,這里介紹如何使用它。首先定義一個名為test的包,因為test為調用的程序,因此我們初始化mod時直接按照程序的名字初始化,即:go mod test,完成初始化。如下:

    go的modules怎么使用

    test目錄下編寫如下代碼:

    package main
    import "gitee.com/luciferofwg/hello"
    func main()  {
    	hello.SayHello()
    }

    然后再命令行中執行go mod tidy整理go mod,此時go mod會根據程序包的引用關系按照包名從互聯網上拉去對應的包。執行完成后go.mod如下:

    go的modules怎么使用

    運行的結果:

    go的modules怎么使用

    需要注意的是:

    默認拉去的是最新的發布版本,如果想制定版本,只需要修改go.mod中require最后面的版本號即可。如何修改go.mod參考go help mod命令的edit項。

    3.2 發布私有包

    3.2.1 go env環境變量和git配置的修改

    1.go env環境變量的修改

    私有包和公開包的區別最大的區別是權限的和git拉去包的過程,這時候需要對go env中的一些參數修改。涉及到的一些參數
    GOINSECURE,GONOPROXY,GONOSUMDB,含義:
    GOINSECURE:如果代碼倉庫是自己搭建的,沒有“合法”的證書,則需要配置這個信息
    GONOPROXY:在這個變量中配置的域名或者倉庫地址不會走代理(我們在前面設置了cn的代理)
    GONOSUMDB:1.15后會對包進行校驗,此處的配置和GONOPROXY的含義一樣
    看一下我們的go env變量,之前已經修改過了,內容如下:

    go的modules怎么使用

    注:
    windows下修改時直接將上述的配置增加系統的環境變量即可,linux下在bash的配置文件中修改(具體修改可以自行搜索)。

    2.git配置的修改

    由于是私有的包,拉去時需要獲取拉去的權限,默認的https或者http的方式需要密碼。如果我們本地已經配置了對應的gitee上的私鑰,且已經在gitee對應的賬戶上配置了權限,那么我們就可以通過git@xxx的方式訪問私有的倉庫。
    打開本地git的配置,windows下是c:\\user\\用戶名\\.bashconfig文件,打開這個文件。增加以下代碼:

    [url "git@gitee.com:"]insteadof = https://gitee.com

    表示訪問https://gitee.com的過程替換為git@gitee.com:,即通過bash就可以訪問私有庫了。

    3.2.2 私有包的實現

    1.私有包實現

    我們創建一個私有的倉庫,名為hi,包含一個函數SayHello,打印hello world。
    同樣的,創建go.mod,實現SayHello函數,推送到gitee。

    圖1 私有倉庫hi

    go的modules怎么使用

    2.函數和源碼

    // hi包的SayHello函數
    package hi
    
    import "fmt"
    
    func SayHello() {
    	fmt.Println("hi, world")
    }

    hi包的go.mod

    go的modules怎么使用

    3.2.3 私有包的發布

    根據上述的源碼,使用同樣的方式發布版本。
    圖1 發布的版本1.0.0

    go的modules怎么使用

    3.2.4 私有包的引用

    如果已經配置了go env的參數和git配置,使用的過程和公開包的使用是一樣的。基于原來的版本,增加了一個hi包的函數引用和導入,在test目錄下執行go mod tidy,就會自動拉取發布的包了。

    package main
    
    import (
    	"gitee.com/luciferofwg/hello"
    	"gitee.com/luciferofwg/hi"
    )
    
    func main() {
    	hello.SayHello()
    	hi.SayHello()
    }

    test程序的go.mod如下:

    go的modules怎么使用

    到此,相信大家對“go的modules怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    凭祥市| 施秉县| 湖南省| 南澳县| 寻乌县| 睢宁县| 汾阳市| 阿拉善右旗| 瓮安县| 丹江口市| 建瓯市| 凌源市| 乌恰县| 洛南县| 滕州市| 报价| 黄梅县| 深州市| 平昌县| 灌云县| 揭西县| 珲春市| 辽源市| 清新县| 三台县| 图木舒克市| 安徽省| 泰顺县| 高密市| 乐至县| 镇巴县| 通渭县| 淅川县| 松阳县| 吉安市| 泗洪县| 故城县| 静宁县| 从化市| 黑龙江省| 长阳|