go build不从本地gopath获取_跟我一起学习go语言,包依赖管理工具go mod
Go Module是Go會(huì)在1.12中正式推出的包管理機(jī)制。
Go mod 簡(jiǎn)介
Golang一直存在一個(gè)被人詬病的問題是缺少一個(gè)官方的包依賴管理工具。從我個(gè)人的角度上來看存在兩個(gè)問題:
在Go1.11時(shí),官方推出了go mod作為官方的依賴管理工具。而go mod與之前的利用vendor特性的依賴管理工具的不同點(diǎn)在于,go mod 更類似于maven這種本地緩存庫的管理方式,不論你有多少個(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)建方式,其主要是通過GOPATH/pkg/mod下的緩存包來對(duì)工程進(jìn)行構(gòu)建。在Go 1.11中已經(jīng)可以使用,同以往新添加的功能一樣,go mod 可以通過GO111MODULE來控制是否啟用,GO111MODULE有一下三種類型。
- on 所有的構(gòu)建,都使用Module機(jī)制
- off 所有的構(gòu)建,都不使用Module機(jī)制,而是使用GOPATH和Vendor
- auto 在GOPATH下的工程,不使用Module機(jī)制,不在GOPATH下的工程使用
Go mod化處理步驟
這里我主要說一下,對(duì)舊工程如何進(jìn)行g(shù)o mod化處理。通過網(wǎng)上搜索的文檔加上自我實(shí)踐,我總結(jié)成了以下三個(gè)步驟。對(duì)于新工程的處理可直接從第二部分開始。
- 將需要進(jìn)行版本管理的代碼從GOPATH路徑下移出
- 在項(xiàng)目的根目錄下使用命令go mod init projectName
- 在該目錄下執(zhí)行g(shù)o build main.go
從GOPATH中移出工程
這一步其實(shí)是不一定需要的,不過個(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)。
/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í)踐,需要說一下。一般網(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星国行和港行有什么区别(三星智能手机)
- 下一篇: PhpStorm 设置php代码格式