import
- import的是目錄,import時(shí)會(huì)從GOROOT中搜索包(標(biāo)準(zhǔn)包)或從GOPATH/src下搜索包,如果GOPATH有多個(gè),則從第一個(gè)開始,直到找到包。import也可以不依賴GOPATH,使用相對(duì)路徑引入,相對(duì)于main包的路徑。
- package包名是調(diào)用包的時(shí)候使用,一般建議package包名與包所在的目錄保持一致。
go get
- go get 會(huì)下載包的代碼包并編譯包(.a文件)
- 如果GOPATH有多個(gè),go get 會(huì)將代碼下載到第一個(gè)GOPATH的src目錄,包編譯到pkg目錄
go instal與go build
- go install 編譯并安裝包(包括main包),包名為包所在目錄,main包(主程序)會(huì)安裝到bin目錄,其它包會(huì)安裝到pkg目錄。
- go build 只能編譯main包,包名默認(rèn)為包所在目錄,可通過(guò)-o參數(shù)指定包名。
- 如果GOPATH中有同名的包,只會(huì)在GOPATH中的第一個(gè)能go install成功,其它的失敗,報(bào)錯(cuò):
no install location for $GOPATH/go_2/src/myp: hidden by $GOPATH/go_1/src/myp
GOPATH
- 允許設(shè)置多個(gè)路徑,和各個(gè)系統(tǒng)環(huán)境多路徑設(shè)置一樣,windows用“;”,linux(macOS)用“:”分隔。
- 如果你無(wú)需導(dǎo)入外部包且使用相對(duì)路徑導(dǎo)入自己的代碼,代碼不一定非要放在GOPATH里,但不推薦這樣做.
- GOPATH的bin、pkg目錄會(huì)自動(dòng)創(chuàng)建,src目錄放置源代碼,也可不創(chuàng)建src,但需import的包能在GOPATH中找到,且go install時(shí)會(huì)報(bào)錯(cuò):
go install: no install location for directory GOPATH/m3 outside GOPATH - 從Go 1.8開始,將GOPATH設(shè)置為環(huán)境變量不是必需的。如果沒(méi)有設(shè)置或設(shè)置為空,Go使用默認(rèn)的GOPATH為 $HOME/go。
GOBIN
- go install main包存放的路徑,設(shè)置多個(gè)時(shí),會(huì)被當(dāng)成一個(gè)完整的路徑(列如:/home/bin1:/home/bin2 被視為一個(gè)路徑,也就是不請(qǐng)?jiān)试S設(shè)置多個(gè)路徑)。設(shè)置為空時(shí),放在各自GOPATH目錄的bin文件夾中(前提是:main包的代碼文件不能直接放在GOPATH/src目錄下)。
- GOBIN為空,且main包的代碼文件在GOPATH/src目錄下時(shí),go install時(shí)報(bào)錯(cuò):
go install: no install location for .go files listed on command line (GOBIN not set)
go install: no install location for directory $GOPATH/src outside GOPATH For more details see: 'go help gopath' - 解決方法:1、設(shè)置GOBIN,編譯后包名為src。2、將main包代碼放在一個(gè)目錄下,編譯后包名為目錄名。
- GOBIN沒(méi)有設(shè)置時(shí),使用GOPATH/src/bin,有設(shè)置時(shí)使用設(shè)置。
Go Modules
- Go modules 是 Go 語(yǔ)言的依賴解決方案,發(fā)布于 Go1.11,成長(zhǎng)于 Go1.12,豐富于 Go1.13,正式于 Go1.14 推薦在生產(chǎn)上使用。
- 相關(guān)命令
| 命令 | 作用 |
|---|---|
| go mod init | 生成 go.mod 文件 |
| go mod download | 下載 go.mod 文件中指明的所有依賴 |
| go mod tidy | 整理現(xiàn)有的依賴 |
| go mod graph | 查看現(xiàn)有的依賴結(jié)構(gòu) |
| go mod edit | 編輯 go.mod 文件 |
| go mod vendor | 導(dǎo)出項(xiàng)目所有的依賴到vendor目錄 |
| go mod verify | 校驗(yàn)一個(gè)模塊是否被篡改過(guò) |
| go mod why | 查看為什么需要依賴某模塊 |
- 相關(guān)環(huán)境變量
| 變量 | 作用 |
|---|---|
| GO111MODULE | auto:項(xiàng)目包含了 go.mod 文件的話啟用 Go modules。on:?jiǎn)⒂?Go modules,推薦設(shè)置,將會(huì)是未來(lái)版本中的默認(rèn)值。off:禁用 Go modules,不推薦設(shè)置。 |
| GOPROXY | 設(shè)置 Go 模塊代理,go env -w GOPROXY=https://goproxy.cn,direct |
| GONOPROXY/GONOSUMDB/GOPRIVATE | 當(dāng)前項(xiàng)目依賴了私有模塊,比如私有 git 倉(cāng)庫(kù),或是 github 中的私有庫(kù)時(shí),需要設(shè)置 |
- go.mod文件結(jié)構(gòu)
| 配置 | 作用 |
|---|---|
| module | 用于定義當(dāng)前項(xiàng)目的模塊路徑。 |
| go | 用于標(biāo)識(shí)當(dāng)前模塊的 Go 語(yǔ)言版本,值為初始化模塊時(shí)的版本,目前來(lái)看還只是個(gè)標(biāo)識(shí)作用。 |
| require | 用于設(shè)置一個(gè)特定的模塊版本。 |
| exclude | 用于從使用中排除一個(gè)特定的模塊版本。 |
| replace | 用于將一個(gè)模塊版本替換為另外一個(gè)模塊版本。 |
- go module導(dǎo)入本地包的方法
在一個(gè)項(xiàng)目下,直接導(dǎo)入。
在不同的項(xiàng)目下,使用replace,并使用相對(duì)路徑尋找包:
require "p1" v0.0.0 (可省略)
replace "p1" => "../p1"
參考:
Go Modules 終極入門