14.依赖管理
终于来到了实战前的最后一章,本章将介绍,如何上传自己的包供他人使用,如何下载第三方包。
1. 上传一个自己的包mymath
- 新建一个
mymath
文件夹,并进入该文件夹,用vscode
打开,再打开vscode
的终端
- 使用
go mod init
初始化一个go项目
把aeilang
换成自己的账户名,其他的不变,mymath是模块名,即包名,但要和所在文件夹名mymath
相同
会生成一个go.mod
文件,记录模块名,和版本信息,以及将来的依赖信息
- 创建一个
math.go
文件,并写入如下代码
最终目录如下:
- 初始化
git
项目
- 去
github
创建同名仓库mymath
, 复制仓库地址:
我的仓库地址是https://github.com/aeilang/mymath.git
- 增加origin远程地址:
如果你的git
主分支名字是master
,使用git branch -M main
把主分支重命名成main
。
执行以下命令,添加远程仓库
- 推送你的代码
OK! 别人以及可以开始使用你的包。
2. 下载第三方包
好的,我们现在就下载刚刚上传的包试试。
和上面一样,新建一个mytest
文件夹, 使用vscode
打开。
再初始化一个go项目
使用go get 仓库地址
命令下载你刚上传的包 mymath
新建一个main.go
文件,写入如下内容
最终目录如下:
运行go run main.go
,输出
欧耶,你已经学会了如何上传一个包供他人使用,和如何下载第三方包供自己使用!
3. 本地开发协作
有时,你不想公开你的包,但你有一个项目依赖另一个项目,这时,就可以使用go work
来协作了!
创建一个work
文件夹,并用vscode
打开。
在work
文件夹里分别初始化两个go项目。目录结构如下: (文件夹名字随意)
在work
文件夹中打开终端, 执行
可以看到,在work文件夹中生成了go.work
文件。
OK! 现在,两个项目可以协调工作了,例如mytest
项目引用myrand
包里的代码。试验一下
新建rand.go
和 main.go
文件,最终目录如下
在myrand/rand.go
中写入如下代码
在mytest/main.go
中引用myrand
包,写入如下内容
运行go run main.go
输出
成功!
4. 项目初始化的流程
写到最后忘了讲go项目初始化的流程了,在这里补上吧。
4.1 init函数
和main
函数一样,init
函数没有输入,也没有输出; 和main
函数不一样,main函数
在main包
中有且只有一个, init
函数可以在任何包里有任意多个。
4.2 初始化流程
一下面的test项目为例, 目录结构
代码如下:
三个包分别定义了init函数
, 相关的变量和常量,其中main
包依赖foo
和bar
包。每个包的变量a
初始化时都打印对应的信息,因为常量是在编译器确定的,无法观察期初始化的过程。
运行
输出
初始化流程为,
- go会优先初始化依赖包,按照深度优先的顺序初始化,如果依赖包还依赖其他包,会优先初始化其他包。
- 包内初始化的顺序: 先初始化常量(编译器完成) -> 再初始化全局变量 -> 最后运行
init函数
main包
的main
函数是程序的入口,最后会执行main
函数。