本文的主题是如何导入自定义包,在说如何导入自定义包的之前,我们先看一下项目中go.mod文件中的内容:
module gitee.com/ydstudiox/server-framework
go 1.18
require (
github.com/sirupsen/logrus v1.9.0
gopkg.in/yaml.v2 v2.4.0
)
require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
require
关键字后面的都是项目的依赖,依赖规则由两个部分组成,前面一部分是包路径,后面一部分表示的是版本号。你会发现有两种版本号,一种是我们很熟悉的git标签,比如v1.9.0,另一种就比较复杂一些,它是:版本号 + 时间戳 + hash比如:v0.0.0-20220715151400-c0bba94af5f8,它其实是
精准的对应着master分支上的一个git log记录,后面的哈希是git log哈希的前 12 位。
git 提交记录如下:
E:\workGo\server-framework>git log
commit fc98374a19d430838fa7ea5d36de398df4fbd585 (HEAD -> master, origin/master, origin/HEAD)
Author: liuyang <liuyang>
Date: Sat Oct 15 18:35:49 2022 +0800
更新router使用方式
commit 1dfa2140eb8996dbccb50badaa6d1ef468e1efce (origin/dev, dev)
Author: liuyang <liuyang>
Date: Sat Oct 15 17:08:02 2022 +0800
优化router的方法
commit 9b6dab3a7176bc071d5b89ebfe51ede2f963bd7e (origin/release, release)
Author: liuyang <liuyang>
Date: Tue Oct 11 23:04:57 2022 +0800
版本初始化
commit 3784ba04f39b55e1cc661b115940630527cad64e (origin/develop)
Author: ydstudiox <liuyang2411@gmail.com>
Date: Tue Oct 11 14:49:37 2022 +0000
Initial commit
最近的一次提交的hash值是:fc98374a19d430838fa7ea5d36de398df4fbd585,前12位是fc98374a19d4 和项目中的依赖是一致的
require (
gitee.com/ydstudiox/server-framework v0.0.0-20221015103549-fc98374a19d4
github.com/sirupsen/logrus v1.9.0
)
好了,我们就不说其他的了,我们来说一说如何实现导入自定义包的方式。文章中涉及的项目如下:
- 依赖包为server-framework,
go.mod
文件中的内容如下:
module gitee.com/ydstudiox/server-framework
- 使用依赖包的项目game-server,
go.mod
文件中的内容如下:
module gitee.com/ydstudiox/game-server
两个项目同时在GOPATH目录下
按包名导入
使用 replace
命令,形式为:项目所在目录名/package名=> 绝对路径||相对路径/package名,然后执行go mod tidy
即可
"相对路径"这个指的是server-framework相对项目game-server的路径,具体示例如下:
相对路径
require gitee.com/ydstudiox/server-framework v0.0.0-20221015103549-fc98374a19d4
replace server-framework/gitee.com/ydstudiox/server-framework => ../server-framework/gitee.com/ydstudiox/server-framework
这样也行
require gitee.com/ydstudiox/server-framework v0.0.0-20221015103549-fc98374a19d4
replace server-framework/gitee.com/ydstudiox/server-framework => ../gitee.com/ydstudiox/server-framework
这样也行
require gitee.com/ydstudiox/server-framework v0.0.0-20221015103549-fc98374a19d4
replace server-framework/gitee.com/ydstudiox/server-framework => E:\workGo\server-framework
其实无论是绝对路径还是相对路径,只要能让程序找到被依赖的代码就行
按路径导入
按照包名导入的方式和其几种变种都可以实现导入自定义包的需求,但是有一个问题就是导入的依赖跟git仓库有了依赖,要是本地调试时依赖库的代码有更新就必须提交到git,使用依赖库的项目就需要删掉require项,然后执行go mod tidy
才能来到最新的代码。要是两者都是在本机的GOPATH目录下,这样做就有点不方便了,那么有没有一种方式能够及时的将代码更新又不需要提交代码到git仓库的呢?答案是有的,我们可以直接使用路径导入的方式导入依赖,具体操作如下:
require gitee.com/ydstudiox/server-framework v0.0.0-20221015103549-fc98374a19d4
replace gitee.com/ydstudiox/server-framework => E:\workGo\server-framework
还有一种方式是最简洁的方式,我推崇此种方式导入本地的自定义包,具体如下:
require gitee.com/ydstudiox/server-framework v0.0.0
replace gitee.com/ydstudiox/server-framework => ../server-framework
看这样使用多简洁,依赖库代码有变动不用提交到git上,版本号也不用修改,代码还能及时被载入。其实,写到这个地方,我发现前面其实是走入了歧途,本来很简单的东西,被我给搞复杂了,哈哈!