不要吝嗇你的批評與感悟,敬請留言,咱們一塊兒進步。mysql
若是你有過如下問題,歡迎閱讀文章,提出意見與建議git
go mod 怎麼使用 GOPATH是什麼 GO111MODULE="" 這個參數決定了什麼 go get、go download 有什麼區別
用過Java 的同窗都知道,對依賴的管理從原始的手動引入jar包,到使用maven等進行自動化管理工具去引入第三方依賴,使用別人已經開發好的優秀工具。若是使用過Python的同窗可能會熟練的使用pip install 第三方的工具包。Java 和Python的第三方工具包都是集中式管理的,使用maven 或者是pip 都是從對應的管理中心下載更新依賴。固然還有 npm、yarn、gradle等其餘語言的依賴版本工具。github
在go語言中,第三方依賴的管理工具通過了一個漫長的發展過程。在GO1.11 發佈以前govendor、dep等工具百花齊放。知道go mod 出現,開始一統天下。go 的依賴很是簡單粗暴,只要依賴源碼就能夠了。例如:golang
import "github.com/jinzhu/gorm"
複製代碼
github.com/jinzhu/gorm
就是gorm的GitHub項目路徑。web
Go 在1.11 以前使用GOPATH模式
進行依賴的管理。安裝部署go環境,使用go 進行開發的時候強制被要求要設置GOPATH
(固然安裝過程當中也會默認指定$GOPATH=~/go
)。 要在GOPATH
路徑下新建 src /bin /pkg文
件夾。sql
go
├── bin # 存儲go編譯生成的二進制可執行文件,通常會把該路徑配置到PATH中,PATH=$PATH:$GOPATH/bin
├── pkg # 存儲預編譯的目標文件,以加快後續的編譯速度
└── src # 存儲Go的源代碼,通常以$GOPATH/src/github.com/foo/bar的路徑存放
複製代碼
➜ go go env |grep GOPATH
GOPATH="/Users/bytedance/go"
複製代碼
在這種模式下,若是使用go get
拉取外部依賴會自動下載並安裝到$GOPATH
目錄下。npm
這種模式下,go get
沒有版本管理的概念,沒法處理依賴不一樣版本的問題,由於同一個依賴都存在同一個路徑下面。網絡
在Go官方尚未推出Go Modules 的時候,go的依賴管理工具可謂是 百花齊放,例如 govendor
, dep
,可是最終Go Modules發佈,平息了諸侯割據的局面。app
Go1.11 開始推出Go Modules ,Go1.13開始再也不推薦使用GOPATH。意思就是說你能夠在任何路徑下存放你的Go源碼文件, 不用再像之前同樣非得放到$GOPATH/src
中。 每個go 項目 都是一個 Modules。vgo 是Go Modules的前身。maven
在Go Modules環境下出現了一個很重要的環境變量GO111MODULE
➜ ~ go env
GO111MODULE="auto"
GOPROXY="https://proxy.golang.org,direct"
GONOPROXY=""
GOSUMDB="sum.golang.org"
GONOSUMDB=""
GOPRIVATE=""
複製代碼
若是要對go 的環境變量進行設置,可使用
go env -w GO111MODULE=on # 設置go 環境變量
go env -u # 恢復初始設置
複製代碼
GO111MODULE
這個環境變量是用來做爲使用Go Modules 的開關。能夠說這個變量是歷史產物,頗有肯能會在未來Go的新版本中去除掉。
GO111MODULE="auto" # 只要項目包含了go.mod 文件的話就啓用Go modules, 在Go1.11-1.14 中是默認值
GO111MODULE="on" # 啓用Go Modules
GO111MODULE="off" # 禁用Go Modules, 對老的項目進行兼容
複製代碼
GOPROXY 是Go Modules的代理,能夠經過鏡像站點快速拉取(集中式的概念?),能夠設置多個代理。
GOPROXY="https://proxy.golang.org,direct"
複製代碼
direct
的意思是若是經過代理獲取不到go get 就會經過源地址直接去抓取
建立Go Modules的基本命令
➜ ~ go mod
Go mod provides access to operations on modules.
Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.
# 全部的go commands 都支持 modules。
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
Use "go help mod <command>" for more information about a command.
複製代碼
go mod init
在當前目錄初始化一個新的module, 就是說將該目錄下的工程文件初始化爲一個go module.
若是當前目錄在GOPATH中,這條命令無需傳入參數,參數默認爲 GOPATH/src 到該目錄的相對路徑。
➜ demo pwd
/Users/bytedance/go/src/github.com/airren/demo
➜ demo go mod init
go: creating new go.mod: module github.com/airren/demo
➜ demo ls
go.mod
➜ demo cat go.mod
module github.com/airren/demo
go 1.14
➜ demo
複製代碼
若是當前目錄不在GOPATH中,要手動指定module的名字
➜ gotest pwd
/Users/bytedance/Desktop/gotest
➜ gotest go mod init # 若是不在GOPATH路徑下
go: cannot determine module path for source directory /Users/bytedance/Desktop/gotest (outside GOPATH, module path must be specified)
Example usage:
'go mod init example.com/m' to initialize a v0 or v1 module
'go mod init example.com/m/v2' to initialize a v2 module
Run 'go help mod init' for more information.
➜ gotest go mod init github.com/airren/gotest
go: creating new go.mod: module github.com/airren/gotest
➜ gotest cat go.mod
module github.com/airren/gotest
go 1.14
➜ gotest
複製代碼
go mod download
go mod download 命令會把package下載到 GOPATH/pkg/mod路徑下,下載時要指定版本能夠用@latest。能夠任意路徑下使用go mod download
➜ jinzhu pwd
/Users/bytedance/go/pkg/mod/github.com/jinzhu
➜ jinzhu ls
gorm@v1.9.11-0.20190912141731-0c98e7d712e2 inflection@v1.0.0
gorm@v1.9.12 now@v1.0.1
inflection@v0.0.0-20180308033659-04140366298a now@v1.1.1
➜ jinzhu go mod download -x github.com/jinzhu/gorm@v1.9.8 # 要指定版本
➜ jinzhu ls
gorm@v1.9.11-0.20190912141731-0c98e7d712e2 inflection@v1.0.0
gorm@v1.9.12 now@v1.0.1
gorm@v1.9.8 now@v1.1.1
inflection@v0.0.0-20180308033659-04140366298a
➜ jinzhu cd gorm@v1.9.8
複製代碼
import 導入的是文件存儲的相對路徑(不能使用絕對路徑),並非package的name,可是在調用Function的時候使用的是package的name。
import 首先會從GOPATH/src 中尋找,若是是以./ 或者 ../ 開頭的import 直接去對應的相對路徑尋找。
import 時候是不區分大小寫的,因此在go項目中folder的name儘可能是小寫,能夠有下滑線_, 可是packagename必定不能有\_
,不然golint會有提示。
文件結構如圖所示
gotest
├── format_print
│ └── colorprintpath.go # 文件名並不影響 import
└── sdemo
├── demo.go
複製代碼
colorprintpath.go
package colorprintfile // 調用方法時候經過package name 調用
import "fmt"
// NewPirnt is the new format print 公開方法要有註釋
func NewPrint(content string) {
fmt.Printf("This is the content: %v \n", content)
}
複製代碼
demo.go
package main
import "../format_print" // import 使用的是相對路徑
func main(){
colorprintfile.NewPrint("hello") // 調用package中的公開方法
}
複製代碼
若是使用了go mod, 在項目文件下有了go.mod, 文件中會有
module github.com/airren/gotest
複製代碼
此時就不能使用相對路徑引用package, 要經過modules的方式引用
package main
import "github.com/airren/gotest/format_print"
func main(){
colorprintfile.NewPrint("hello") // 調用package中的公開方法
}
複製代碼
能夠在任意路徑下執行go get
用於從遠程代碼倉庫(github, gitlab,gogs)上下載並安裝代碼包
支持的代碼版本控制系統有: Git , Mercurial(hg),SVN, Bazaar
指定的代碼包會被下載到$GOPATH
中包含的第一個工做區的src目錄中,而後再安裝
經常使用參數
-d # 只執行下載動做,而不執行安裝動做
-fix # 在下載代碼包後先執行修正動做,然後再進行編譯和安裝
-u # 利用網絡來更新已有的代碼包及其依賴包
-x # 顯示過程
複製代碼
例如使用go get
獲取 gorm。 經過-x
參數能夠展現詳細的過程。
➜ ~ go get -u -x github.com/jinzhu/gorm
cd .
git clone -- https://github.com/jinzhu/gorm /Users/bytedance/go/src/github.com/jinzhu/gorm
cd /Users/bytedance/go/src/github.com/jinzhu/gorm
git submodule update --init --recursive
cd /Users/bytedance/go/src/github.com/jinzhu/gorm
git show-ref
cd /Users/bytedance/go/src/github.com/jinzhu/gorm
git submodule update --init --recursive
cd /Users/bytedance/go/src/github.com/jinzhu/inflection
git config remote.origin.url
cd /Users/bytedance/go/src/github.com/jinzhu/inflection
git pull --ff-only
cd /Users/bytedance/go/src/github.com/jinzhu/inflection
git submodule update --init --recursive
cd /Users/bytedance/go/src/github.com/jinzhu/inflection
git show-ref
cd /Users/bytedance/go/src/github.com/jinzhu/inflection
git submodule update --init --recursive
WORK=/var/folders/pz/w7jm4wm933lcspm82kff26600000gn/T/go-build644292157
複製代碼
若是在具備go.mod 的項目的文件夾下使用go get , 會將對應的依賴以及版本寫入go.mod, go.sum 是自動生成的,具體介紹能夠查看https://studygolang.com/articles/25658
➜ gotest cat go.mod
module github.com/airren/gotest
go 1.14
➜ gotest cat go.sum
cat: go.sum: No such file or directory
➜ gotest go get -u github.com/jinzhu/gorm/
go: github.com/jinzhu/gorm upgrade => v1.9.12
➜ gotest cat go.mod
module github.com/airren/gotest
go 1.14
require github.com/jinzhu/gorm v1.9.12 // indirect
➜ gotest cat go.sum
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/jinzhu/gorm v1.9.12 h1:Drgk1clyWT9t9ERbzHza6Mj/8FY/CqMyVzOiHviMo6Q=
github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
複製代碼
不要吝嗇你的批評與感悟,敬請留言,咱們一塊兒進步。
https://github.com/golang/go/wiki/Modules
https://blog.golang.org/using-go-modules
https://juejin.im/post/5e57537cf265da57584da62b
https://learnku.com/go/t/39086
https://studygolang.com/articles/25658