一、背景
在引入Go Module管理之前,即在Go 版本在1.11之前,項目的框架結(jié)構(gòu)主要是bin、pkg、src,如下的結(jié)構(gòu)應(yīng)該都比較熟悉
~/projectname/
bin/
pkg/
src/
mypack/ --項目內(nèi)容
foo.go
bar.go
mypack_test.go
commpack --三方公共庫
comunit.go
正常情況下,如果引入第三方庫,有三種引入方式:
- 一般三方庫代碼都是需要放在GOPATH的Src路徑下面,然后直接引入
import (
"commpack"
)
- 通過本地相對路徑引用的方式,如:
import (
"../commpack"
)
- 引用git源碼庫的http路徑
import (
"github.com/projectname/commpack"
)
二、Go Module項目工程管理
在Go 1.13版本之后,引入了Go Module模式,通過go.mod文件配置,改進了項目框架結(jié)構(gòu)。
下面介紹下如何通過腳本創(chuàng)建項目:
- 進入任何路徑,不需要在GOPATH路徑下面,創(chuàng)建項目。
該步驟主要就是生成go.mod文件,也就是通過改文件來對項目、包進行項目工程管理。
# mkdir projectname
# cd projectname
# go mod init projectname //這里的projectname其實就是module name,可以跟project name不同
注意:
當(dāng)執(zhí)行g(shù)o mod init代碼的時候,就是在項目目錄的根目錄創(chuàng)建一個go.mod文件,里面的首行描述為模塊路徑,后續(xù)import不同模塊的時候,都帶上這個路徑。默認(rèn)跟projectname同名。
go.mod文件內(nèi)容如下,具體每個節(jié)點用戶描述參考結(jié)構(gòu)描述:
module projectname //此處的projectname,可以為本地項目名,如gateway,或者 源碼項目路徑 github.com/gateway
go 1.14
- 新建公共package
# mkdir commpack
# cd commpack
# vi foo.go //創(chuàng)建go文件
foo.go 文件源碼如下,參考了網(wǎng)上的例子
package commpack
import "fmt"
func Greet(name string) string {
return fmt.Sprintf("%s,hello", name)
}
- 新建main package,demo的項目入口文件
# mkdir mypack
# cd mypack
# vi main.go
main.go 文件源碼如下
package main
import (
"fmt"
"projectname/commpack" //注意這里導(dǎo)入路徑,projectname是定義在go.mod文件里面
)
func main() {
fmt.Println(commpack.Greet("liyu"))
}
4.現(xiàn)在回過頭來,整體的項目結(jié)構(gòu)如下,特別注意下,文件名和package名可以不一致。
~/projectname/
commpack/
foo.go
foo_test.go
mypack
main.go
go.mod
- 執(zhí)行編譯、運行,
# cd projectname/mypack
# go run main.go
附注
# Go.Mod的文件結(jié)構(gòu)描述
module
to define the module path;
go
to set the expected language version;
require
to require a particular module at a given version or later;
exclude
to exclude a particular module version from use; and
replace
to replace a module version with a different module version.
# Go Module常用命令
go mod init # 初始化go.mod
go mod tidy # 更新依賴文件
go mod download # 下載依賴文件
go mod vendor # 將依賴轉(zhuǎn)移至本地的vendor文件
go mod edit # 手動修改依賴文件
go mod graph # 打印依賴圖
go mod verify # 校驗依賴
參考
Go Module 工程化實踐 https://segmentfault.com/a/1190000018398763