- 自动下载所有依赖包
go get -d -v ./...
-d
只下载代码包,不执行安装命令-v
打印详细日志和调试日志。这里加上这个标志会把每个下载的包都打印出来;./...
这个表示路径,代表当前目录下所有的文件。
modules
-
通过go.mod文件记录包依赖,go.sum文件避免恶意修改
-
项目不必一定要组织在GOPATH路径下
- import的包源码也不再是组织在src目录下,而是pkg/mod目录下
- 该目录下的包名后面还会有
@<tag_num>
,这样go mod
就可以区分不同版本- 例如
$GOPATH\pkg\mod\github.com\go-sql-driver\[email protected]
- 版本号就是 repo 的 tag
- 对于没有打 tag 的,go.mod 的格式是 pseudo-version。它的含义是
v0.0.0-yyyymmddhhmmss-abcdefabcdef
- 例如
-
从govendor迁移到gomod只要
go mod init 模块名
然后go run/build
一次即可 -
通过replace能够重定向包地址
- google域名下的包可以重定向到GitHub
-
环境变量
GO111MODULE
设置为on则强制使用mod模式,设置为auto则在GOPATH路径外开启 -
模块名可以任意取,但是为了更具有兼容性,应该遵循
github.com/name/repo
的格式
常用命令
go mod init <模块名> # 初始化模块
go mod download # 下载依赖包
go mod tidy # 移除未用到的包,下载缺失的包
go mod verity # 验证包依赖是否正确
go mod vendor # 生成vendor目录
参考
github-Modules
Golang Package 与 Module 简介
vendor
- vendor目录下的vendor.json文件记录的所有依赖信息
- 在上传项目到GitHub时,可以只上传vendor.json文件,其他人可以通过govendor sync命令根据该文件重新安装依赖到vendor文件夹
# 安装govendor
go get -u -v github.com/kardianos/govendor
# 常用命令
govendor init # 初始化vendor目录
govendor list # 列出当前所有包依赖
govendor add package_path # 添加依赖包
govendor add +e # 添加所有为什么GOPATH路径下的依赖包
govendor fetch packge_path #添加远程依赖包
govendor update packge_path #更新依赖包
govendor remove packge_path #删除依赖包
govendor sync #根据vendor.json安装依赖包
参考
https://blog.csdn.net/dupeng0811/article/details/89877712
import
- 当我们导入第三方包时,编译器优先寻找已经编译好的包对象(pkg目录下),如果没有包对象,就会去源码目录寻找相应的源码来编译
- 当我们在其他项目引入包含
internal
包的依赖时,Go 语言会在编译时报错-
这种错误只有在被引入的 internal 包不存在于当前项目树中才会发生,如果在同一个项目中引入该项目的 internal 包并不会出现这种错误
-
init
- init函数会在main函数之前执行
- 需要使用
_
空标志符来导入一个包的目的,就是想执行这个包里的init函数 - 我们不应该在 init 中做过重的初始化逻辑,而是做一些简单、轻量的前置条件判断