2020疫情初关在家里学了go,二年来开发过几个小项目,这几天重装系统,发现有些地方不同了,这里总结一下,以防忘记。
目录结构
+D:+/Projects+/bin+/pkg+/mod+/src+/p1+/package+/cls1+/cls2main.go-/p2
本文所用案例的环境设定:
GO111MOUDLEautoGOPATHd:/ProjectsGOPATHbinpkgsrcsrcgithub.com/c1cls1
d:/Projects/src/p1/main.gop1
一、mod / 非mod 管理方式
go提供了两种项目依赖包的管理方式,一种是mod方式,一种是非mod方式。
1. mod方式
main.go 代码
import("github.com/c1""github.com/c2""bbq.org/o1"
)
终端执行
> go mod init
go.mod
go.modgo buildgo buildgo get
> go get github.com/c1
> go get github.com/c2
> go get bbq.org/o1
%GOPATH%/pkg/modd:/Projects/pkg/modgo.modgo.sumgo.mod
module p1go 1.17require (github.com/c1 v0.0.0-20190825152654-46b345b51c96 // indirectgithub.com/c2 v0.3.1 // indirectbbq.org/o1 v1.24.0 // indirect
)
下载后go会根据版本号自动区分目录
目录结构
+D:+/Projects+/bin+/pkg+/mod+/github.com+/c1@v0.0.0-20190825152654-46b345b51c96+/c2@v0.3.1+/bbq.org+/o1@v1.24.0+/src+/p1+/package+/cls1+/cls2main.gogo.modgo.sum-/p2
2.非mod方式
加载方式有多种,此处的例子就是下一节提到的"项目路径"方式。
main.go 代码
import("github.com/c1""github.com/c2""bbq.org/o1"
)
github.com/c1github.com/c2bbq.org/o1d:/Projects/src/
目录结构
+D:+/Projects+/bin+/pkg+/src+/github.com+/c1+/c2+/bbq.org+/o1+/p1+/package+/cls1+/cls2main.go-/p2
二、包的加载方式
1.项目路径
以项目名为开头直接引用,我称为项目路径
main.go 代码
import("p1/package/cls1""p1/package/cls2"
)
cls1cls2../../
GOPATHsrcgo.modmod
2. 相对路径
在go没有mod的早期版本,本方式较为常见。
main.go 代码
import("./package/cls1""./package/cls2"
)
系统提示目录结构不合理
unexpected directory layout:import path: _/D_/Projects/src/p1/packageroot: D:\Projects\srcdir: D:\Projects\src\p1\pkgexpand root: D:\Projectsexpand dir: D:\Projects\src\p1\pkgseparator: \
p1%GOPATH%/srcGOPATH
目录结构
+D:+Projects+bin+pkg+src+ppp +p1+package+cls1+cls2main.go-p2
go build 报错 unexpected directory layout 的解决
3. 绝对路径
srcppp
main.go 代码
import("d:/Projects/src/p1/package/cls1""d:/Projects/src/p1/package/cls2"
)
系统提示路径无效
main.go:3:2: invalid import path: "d:/Projects/src/p1/package/cls1"
main.go:4:2: invalid import path: "d:/Projects/src/p1/package/cls2"
三、综合使用
结合上面的测试,实践中可以用三种方法。
1. 相对路径法
./
A)共享和私有稍作区隔
main.go 代码
import("github.com/c1""github.com/c2""bbq.org/o1""./package/cls1""./package/cls2"
)
%GOPATH%/srcsrcunexpected directory layout
目录结构
+D:+/Projects+/bin+/pkg+/src+/github.com+/c1+/c2+/bbq.org+/o1+/ppp +/p1+/package+/cls1+/cls2main.go-/p2
B)共享和私有都属一个项目
main.go 代码
import("./package/github.com/c1""./package/github.com/c2""./package/bbq.org/o1""./package/cls1""./package/cls2"
)
GOPATH
目录结构
+D:+/Projects+/bin+/pkg+/src+/ppp +/p1+/package+/cls1+/cls2+/github.com+/c1+/c2+/bbq.org+/o1main.go-/p2
C)必须注意准确的层级关系
注意:
用了相对路径法后,层级关系就必须非常准确。
p1pck
目录结构
+D:+/Projects+/bin+/pkg+/src+/ppp +/p1+/pckshow.go+/package+/cls1main.go-/p2
pck/show.gopackage/cls1
show.go 代码
import("../package/cls1"
)
2. 非mod + 项目路径法
参考本文的“非mod方式”
A)共享和私有稍作区隔
main.go 代码
import("github.com/c1""github.com/c2""bbq.org/o1""p1/package/cls1""p1/package/cls2"
)
%GOPATH%/srcsrc
目录结构
+D:+/Projects+/bin+/pkg+/src+/github.com+/c1+/c2+/bbq.org+/o1+/p1+/package+/cls1+/cls2main.go-/p2
B)共享和私有都属一个项目
main.go 代码
import("p1/package/github.com/c1""p1/package/github.com/c2""p1/package/bbq.org/o1""p1/package/cls1""p1/package/cls2"
)
package
目录结构
+D:+/Projects+/bin+/pkg+/src+/p1+/package+/cls1+/cls2+/github.com+/c1+/c2+/bbq.org+/o1main.go-/p2
3. mod + 项目路径法
mod初始化的方法请参考本文的“mod方式”一节。
go.modgo.modgoproxygo buildgo get
A)共享和私有稍作区隔
main.go 代码
import("github.com/c1""github.com/c2""bbq.org/o1""p1/package/cls1""p1/package/cls2"
)
%GOPATH%/srcgo.modD:/ppp/p1p1go.modp1
目录结构
+D:+/Projects+/bin+/pkg+/mod+/github.com+/c1@v0.0.0-20190825152654-46b345b51c96+/c2@v0.3.1+/bbq.org+/o1@v1.24.0+/src+/ppp +/p1+/package+/cls1+/cls2main.gogo.modgo.sum-/p2
B)共享和私有都属一个项目
main.go 代码
import("github.com/c1""github.com/c2""bbq.org/o1""p1/package/cls1""p1/package/cls2"
)
go mod vendorp1/vendor%GOPATH%/pkg/modD:/Project/pkg/mod
终端执行
> go mod vendor
vendor
目录结构
+D:+/Projects+/bin+/pkg+/src+/ppp +/p1+/package+/cls1+/cls2+/vendor +/github.com+/c1@v0.0.0-20190825152654-46b345b51c96+/c2@v0.3.1+/bbq.org+/o1@v1.24.0main.gogo.modgo.sum-/p2
C)系统自动调用和下载
D:/Project/pkg/modD:/ppp/p1/vendorD:/Project/pkg/modGOPATH
参考:
《go modules:使用 mod 管理项目依赖包,通过vendor实现一键分发编译包》
《Go:go mod vendor 使用》
《go package、import、go.mod 理解 以及 私有包引入》
《go-module的使用》
《go安装依赖包(go get, go module)》
《Golang学习日志 ━━ 下载及安装》
《Golang学习日志 ━━ LiteIDE的主要配置》
《Golang学习日志 ━━ VSCode安装Go插件(代理的使用)及初用mod》
如果有写的不对的地方,欢迎指正,谢谢。