日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

go build不从本地gopath获取_跟我一起学习go语言,包依赖管理工具go mod

發(fā)布時(shí)間:2023/12/19 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go build不从本地gopath获取_跟我一起学习go语言,包依赖管理工具go mod 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Go Module是Go會(huì)在1.12中正式推出的包管理機(jī)制。

Go mod 簡(jiǎn)介

Golang一直存在一個(gè)被人詬病的問(wèn)題是缺少一個(gè)官方的包依賴管理工具。從我個(gè)人的角度上來(lái)看存在兩個(gè)問(wèn)題:

  • GOPATH特性對(duì)于多工程的情況下,支持不算友好。
  • GOPATH無(wú)法對(duì)依賴包進(jìn)行有效的版本管理,沒(méi)有任何地方能夠表明依賴包的具體版本號(hào),無(wú)法簡(jiǎn)單清晰獲取到有效的依賴包版本信息等。
  • 在Go1.11時(shí),官方推出了go mod作為官方的依賴管理工具。而go mod與之前的利用vendor特性的依賴管理工具的不同點(diǎn)在于,go mod 更類似于maven這種本地緩存庫(kù)的管理方式,不論你有多少個(gè)工程,只要你引用的依賴的版本是一致的,那么在本地就只會(huì)有一份依賴文件的存在。而vendor即使依賴的版本是相同的,但如果在不同的工程中進(jìn)行了引用,也會(huì)在工程目錄下的vendor產(chǎn)生一份依賴文件。

    所以Golang在1.11版本中引入了go mod機(jī)制,在統(tǒng)一的位置對(duì)依賴進(jìn)行管理。

    go mod不同于以往基于GOPATH和Vendor的構(gòu)建方式,其主要是通過(guò)GOPATH/pkg/mod下的緩存包來(lái)對(duì)工程進(jìn)行構(gòu)建。在Go 1.11中已經(jīng)可以使用,同以往新添加的功能一樣,go mod 可以通過(guò)GO111MODULE來(lái)控制是否啟用,GO111MODULE有一下三種類型。

    • on 所有的構(gòu)建,都使用Module機(jī)制
    • off 所有的構(gòu)建,都不使用Module機(jī)制,而是使用GOPATH和Vendor
    • auto 在GOPATH下的工程,不使用Module機(jī)制,不在GOPATH下的工程使用

    Go mod化處理步驟

    這里我主要說(shuō)一下,對(duì)舊工程如何進(jìn)行g(shù)o mod化處理。通過(guò)網(wǎng)上搜索的文檔加上自我實(shí)踐,我總結(jié)成了以下三個(gè)步驟。對(duì)于新工程的處理可直接從第二部分開(kāi)始。

    • 將需要進(jìn)行版本管理的代碼從GOPATH路徑下移出
    • 在項(xiàng)目的根目錄下使用命令go mod init projectName
    • 在該目錄下執(zhí)行g(shù)o build main.go

    從GOPATH中移出工程

    這一步其實(shí)是不一定需要的,不過(guò)個(gè)人認(rèn)為可以將工程從GOPATH下移出,單獨(dú)存放。只在GOPATH/pkg/mod目錄下只存放依賴文件。

    在go1.12環(huán)境下,我試驗(yàn)了一下環(huán)境變量GO111MODULE還是起作用的。但是編譯時(shí)默認(rèn)為使用Module機(jī)制進(jìn)行編譯(即GO111MODULE=on)。

  • 如果工程中存在go.mod文件,編譯時(shí)是從GOPATH/pkg/mod下查找依賴。
  • 如果主動(dòng)使用export GO111MODULE=off命令不使用Module機(jī)制,進(jìn)行編譯就會(huì)從GOPATH/src下查找依賴。會(huì)產(chǎn)生以下輸出。(編譯失敗是由于相應(yīng)目錄下無(wú)依賴文件)
  • /usr/local/Cellar/go/1.12.5/libexec/src/golang.org/x/tools/internal/tool (from $GOROOT)

    /Users/dx/go/src/golang.org/x/tools/internal/tool (from $GOPATH)

    初始化go mod

    在這一步根據(jù)我的實(shí)踐,需要說(shuō)一下。一般網(wǎng)上的資料都是建議在工程的根目錄下執(zhí)行g(shù)o mod init projectName命令。在執(zhí)行g(shù)o mod化之后,所有的引用都不再是以GOPATH為相對(duì)路徑的引用了,而是變成了以go.mod中初始化的項(xiàng)目名為起始的引用。

    示例:

    未使用go mod前,當(dāng)前工程路徑和GOPATH為workspace/testmod,即當(dāng)前工程的結(jié)構(gòu)如下:

    ├── bin

    ├── pkg

    └── src

    ├── api

    │ └── supply

    │ └── location

    │ └── location.go

    └── main.go

    location.go

    package location

    import (

    "fmt"

    )

    func Hi(name string) string {

    return fmt.Sprintf("hello %s

    總結(jié)

    以上是生活随笔為你收集整理的go build不从本地gopath获取_跟我一起学习go语言,包依赖管理工具go mod的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。