import
- import的是目录,import时会从GOROOT中搜索包(标准包)或从GOPATH/src下搜索包,如果GOPATH有多个,则从第一个开始,直到找到包。import也可以不依赖GOPATH,使用相对路径引入,相对于main包的路径。
- package包名是调用包的时候使用,一般建议package包名与包所在的目录保持一致。
go get
- go get 会下载包的代码包并编译包(.a文件)
- 如果GOPATH有多个,go get 会将代码下载到第一个GOPATH的src目录,包编译到pkg目录
go instal与go build
- go install 编译并安装包(包括main包),包名为包所在目录,main包(主程序)会安装到bin目录,其它包会安装到pkg目录。
- go build 只能编译main包,包名默认为包所在目录,可通过-o参数指定包名。
- 如果GOPATH中有同名的包,只会在GOPATH中的第一个能go install成功,其它的失败,报错:
no install location for $GOPATH/go_2/src/myp: hidden by $GOPATH/go_1/src/myp
GOPATH
- 允许设置多个路径,和各个系统环境多路径设置一样,windows用“;”,linux(macOS)用“:”分隔。
- 如果你无需导入外部包且使用相对路径导入自己的代码,代码不一定非要放在GOPATH里,但不推荐这样做.
- GOPATH的bin、pkg目录会自动创建,src目录放置源代码,也可不创建src,但需import的包能在GOPATH中找到,且go install时会报错:
go install: no install location for directory GOPATH/m3 outside GOPATH
- 从Go 1.8开始,将GOPATH设置为环境变量不是必需的。如果没有设置或设置为空,Go使用默认的GOPATH为 $HOME/go。
GOBIN
- go install main包存放的路径,设置多个时,会被当成一个完整的路径(列如:/home/bin1:/home/bin2 被视为一个路径,也就是不请允许设置多个路径)。设置为空时,放在各自GOPATH目录的bin文件夹中(前提是:main包的代码文件不能直接放在GOPATH/src目录下)。
- GOBIN为空,且main包的代码文件在GOPATH/src目录下时,go install时报错:
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、设置GOBIN,编译后包名为src。2、将main包代码放在一个目录下,编译后包名为目录名。
- GOBIN没有设置时,使用GOPATH/src/bin,有设置时使用设置。
Go Modules
- Go modules 是 Go 语言的依赖解决方案,发布于 Go1.11,成长于 Go1.12,丰富于 Go1.13,正式于 Go1.14 推荐在生产上使用。
- 相关命令
命令 | 作用 |
---|---|
go mod init | 生成 go.mod 文件 |
go mod download | 下载 go.mod 文件中指明的所有依赖 |
go mod tidy | 整理现有的依赖 |
go mod graph | 查看现有的依赖结构 |
go mod edit | 编辑 go.mod 文件 |
go mod vendor | 导出项目所有的依赖到vendor目录 |
go mod verify | 校验一个模块是否被篡改过 |
go mod why | 查看为什么需要依赖某模块 |
- 相关环境变量
变量 | 作用 |
---|---|
GO111MODULE | auto:项目包含了 go.mod 文件的话启用 Go modules。on:启用 Go modules,推荐设置,将会是未来版本中的默认值。off:禁用 Go modules,不推荐设置。 |
GOPROXY | 设置 Go 模块代理,go env -w GOPROXY=https://goproxy.cn,direct |
GONOPROXY/GONOSUMDB/GOPRIVATE | 当前项目依赖了私有模块,比如私有 git 仓库,或是 github 中的私有库时,需要设置 |
- go.mod文件结构
配置 | 作用 |
---|---|
module | 用于定义当前项目的模块路径。 |
go | 用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用。 |
require | 用于设置一个特定的模块版本。 |
exclude | 用于从使用中排除一个特定的模块版本。 |
replace | 用于将一个模块版本替换为另外一个模块版本。 |
- go module导入本地包的方法
在一个项目下,直接导入。
在不同的项目下,使用replace,并使用相对路径寻找包:
require "p1" v0.0.0 (可省略)
replace "p1" => "../p1"
参考:
Go Modules 终极入门
网友评论