Golang如何导入自定义包

493 阅读3分钟

本文的主题是如何导入自定义包,在说如何导入自定义包的之前,我们先看一下项目中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上,版本号也不用修改,代码还能及时被载入。其实,写到这个地方,我发现前面其实是走入了歧途,本来很简单的东西,被我给搞复杂了,哈哈!