一、背景
在引入Go Module管理之前,即在Go 版本在1.11之前,项目的框架结构主要是bin、pkg、src,如下的结构应该都比较熟悉
~/projectname/
bin/
pkg/
src/
mypack/ --项目内容
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文件配置,改进了项目框架结构。
下面介绍下如何通过脚本创建项目:
- 进入任何路径,不需要在GOPATH路径下面,创建项目。
该步骤主要就是生成go.mod文件,也就是通过改文件来对项目、包进行项目工程管理。
# mkdir projectname
# cd projectname
# go mod init projectname //这里的projectname其实就是module name,可以跟project name不同
注意:
当执行go mod init代码的时候,就是在项目目录的根目录创建一个go.mod文件,里面的首行描述为模块路径,后续import不同模块的时候,都带上这个路径。默认跟projectname同名。
go.mod文件内容如下,具体每个节点用户描述参考结构描述:
module projectname //此处的projectname,可以为本地项目名,如gateway,或者 源码项目路径 github.com/gateway
go 1.14
- 新建公共package
# mkdir commpack
# cd commpack
# vi foo.go //创建go文件
foo.go 文件源码如下,参考了网上的例子
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" //注意这里导入路径,projectname是定义在go.mod文件里面
)
func main() {
fmt.Println(commpack.Greet("liyu"))
}
4.现在回过头来,整体的项目结构如下,特别注意下,文件名和package名可以不一致。
~/projectname/
commpack/
foo.go
foo_test.go
mypack
main.go
go.mod
- 执行编译、运行,
# cd projectname/mypack
# go run main.go
附注
# Go.Mod的文件结构描述
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 # 将依赖转移至本地的vendor文件
go mod edit # 手动修改依赖文件
go mod graph # 打印依赖图
go mod verify # 校验依赖
参考
Go Module 工程化实践 https://segmentfault.com/a/1190000018398763