golang mod 包管理使用 引入本地包

对于多个项目来说,把所有的源码都放在GOPATH下的src目录下非常的不方便。golang给我们提供了一个叫go mod的命令来脱离src目录,方便我们管理go项目。
对于windows用户来说,使用前在机器上必须成功安装了git,因为需要从github上拉取项目依赖的代码。

 

一、简单使用

1.设置GO111MODULE属性

在cmd中执行set GO111MODULE=on
在这里插入图片描述

2.生成mod文件
给我们的项目生成.mod文件,该文件描述项目需要的依赖等
进入我的项目文件夹中,只有一个文件http-server.go
在这里插入图片描述
在该目录下执行go mod init生成.mod文件,文件名是生成的.mod文件中第一行的名称,可以为空,为空时默认和文件夹名称一致。执行go mod init test,生成文件:
在这里插入图片描述

此时已经成功生成了go.mod文件,但是.mod文件中并没有任何的描述依赖。
3.编译
该环境的go环境变量如下,gopath在c:\code\src下,按照以前的思路,除了gopath和goroot以外的目录是无法编译的,但是我们想在上一步中的目录下直接编译。
在这里插入图片描述
进入现有项目目录中,执行go buildgo mod 会自动拉取依赖项,如图:
在这里插入图片描述
上面生成的.mod文件中 v1.1.6为版本信息,默认情况下使用的是最新的版本,如果包打过tag,那么就会使用最新的那个tag对应的版本。

4.结论
上步重新在github上拉取了依赖文件到GOPATH的pkg目录下,从此不再必须将源代码放在GOPATH下了。
在这里插入图片描述
编译成功,生成了可执行程序。

 

二、引入本地包

如果想在你的模块如果想引入你本地其他地方的模块,可以尝试通过 replace 指定目录,而且前提是你的 article 也得 go 的一个模块,而不是按 gopath 下的某个包来引入。

我简答举个例子吧,比如现在有两个项目,分别是 blog 和 article,结果如下:

├─article
│      article.go
│      go.mod
│
├─blog
│      go.mod
│      main.go

blog 是应用的入口,main 所在位置,而 article 可以理解为你写的一个公共的库,其中提供了一个函数 Hello()。现在,要在 blog 中调用 article 中的 Hello() 函数。

article 模块中的 go.mod 内容如下:

module article

go 1.13

article.go 内容如下:

package article

func Hello() string {
        return "Hello"
}

blog 模块中的 go.mod 内容如下:

go 1.13

require github.com/article v0.0.0-incompatible

replace github.com/article => ../article

此处的 replace 稍微介绍下,之所以要是 github.com/article 的格式,是因为在 go1.13 中, go module 名称规范要求路径的第一部分必须满足域名规范,否则可能汇报类似 malformed module path "article": missing dot in first path element 这样的错误。当然,在 go1.12 不会有报这个错误。建议的话,如果是公司内部使用,可以替换成公司内部域名。

replace 的第二个参数指定了不从远程获取,而是本地某个路径下的模块替换 github.com/article。

main.go 的内容如下:

package main

import (
        "fmt"

        "github.com/article"
)

func main() {
        fmt.Println("Hello")
        fmt.Println(article.Hello())
}

此时,在 blog 执行 go run main.go 是可以成功运行的。

 

你可能感兴趣的:(golang mod 包管理使用 引入本地包)