一、背景
在引入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/gatewaygo 1.14
- 新建公共package
# mkdir commpack# cd commpack# vi foo.go //创建go文件
foo.go 文件源码如下,参考了网上的例子
package commpackimport "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 mainimport ( "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;requireto require a particular module at a given version or later;excludeto exclude a particular module version from use; andreplaceto replace a module version with a different module version.
# Go Module常用命令go mod init # 初始化go.modgo 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
文章转载于:https://www.jianshu.com/p/ebaea0ca2314
原著是一个有趣的人,若有侵权,请通知删除
还没有人抢沙发呢~