简书Go语言专栏go

golang go 包管理工具 go mod的详细介绍 ---

2019-02-16  本文已影响173人  魔都一只土拨鼠

go mod 官方的module管理工具

原文:https://github.com/googege/blog/blob/master/go/tool/goMod/README.md
youtube https://www.youtube.com/watch?v=saJ2c006vp4

用法:

在一个非go path的路径中新建一个项目,然后使用go mod init 就可以初始化一个新的包(要开启这个 export GO111MODULE=on写入.bash_profile即可 win的同学自己找找设置 GO111MODULE的win版本设置方法哈),其实跟github(gitlab都行)用在一起更好

  1. 在github上新建一个项目,例如说 test
  2. 在本地将这个远程包给clone过来,然后这个文件夹里面就是一个.git 隐藏的文件项目这个就是git的管理文件包
  3. 将此包放在远离 go path的文件路径里,然后使用 go mod init 就可以创建一个名为 github.com/XXX/test的包
    记住,这个包名不能随意称呼,你的文件夹的名称就是你的包名然后里面的XX.go的名字无所谓,只要package test用对就可以了,然后你会发现你的包内出现了两个文件 go.sumgo.mod 这个sum包你可以忽略,主要是go.mod包这里的包 首先开头是 module github.com/XXX/test 声明了 这个包的具体名称是 "github.com/XXX/test" 但是在调用的时候 包的名称是 test为什么module后面要加上所有的路径呢,原因也是很简单,就是当你 go get github.com/xxx/test的时候用,不然你只有一个test go get是没办法下载这个包的。
  4. 将这个包发布到github即可。

版本

go.mod中的包后面手动输入latest github.com/nfnt/resize latest,go将自动(go list)帮你生成一个版本号 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646

这是gin的go.mod摘选

    github.com/gin-contrib/sse v0.0.0-20190124093953-61b50c2ef482
    github.com/golang/protobuf v1.2.0

这是我本地项目的go.mod摘选:

github.com/gin-contrib/sse v0.0.0-20190125020943-a7658810eb74 // indirect
github.com/golang/protobuf v1.2.0 // indirect

你会发现同样都是v1.2.0 但是上面的那个 一个是 20190124 一个是20190125,我们看一下下载包的时候的bash的截图

finding github.com/stretchr/testify/assert latest

如果你用的包它用的包,它没有指定具体的版本,那么你的latest跟他的就可能不是一回事了,这个要清楚。因为go get 下载的时候是此时此刻的latest。

require github.com/coastroad/test v0.0.0-20190216094021-0555a706efff // indirect
这里 后面就是指定的版本 // indirect就是间接引用的意思。

module github.com/xxx/test/v2

也就是说你的包的名字还是test但是因为版本是v2.X 所以要在包名后面加入大版本号 /v2(一定是v+数字 比如 v2 v3 v4 v5不能改变写法也不能用v2.3这种写法)
然后 调用的时候是这样的


package dd

import(
"github.com/xxx/test/v2"
)

func dd(){

test.Test()
}

也就是说使用imprt的时候 也要加 v2大版本号,但是在函数内调用的时候 还是test 比如这个时候你的版本是v2.45
那么 你的mod文件里最后的标注就是v2.45

就算不是v2.45 不通过打tag的方式来发布 比如还是默认的数字,那么只要你在mod中指定是v2 你的版本大号就是v2
在import中引入还是需要加上v2 只是在mod中 显示的信息是你的最后编辑时间。

还有种写法是

module github.com/xx/app.v2

这种写法也是类似,只是官方不推荐这种写法。

综上:

// 你的包
go.mod 文件写法 : module github.com/xxx/test/v2

别人用你的包的写法 import(
"github.com/xxx/test/v2"
)

func dd(){
test.Test()
}

包的存放位置

再使用了go mod后你的go path将没有用了,但是存放的包的位置还是在 老的go path 更明确来说是在 $gopath/src路径
这个路径会有两个文件 pkg bin 前面这个包是存放的非可执行的包 后面的bin放置的就是可执行的包,你可以把path指向这个bin即可。

go mod tidy

这个命令很有用 首先我们看看它的官方解释 tidy: add missing and remove unused modules
也就是说 你的go.mod中多引入的或者是少引入的 使用 go mod tidy 它可以帮你处理

我的包是可执行的文件,我发布到github上让人使用我的mod该怎么办

你的go.mod 可以写成 github.com/xxx/test但是你的文件的package 应该写成main 或者目前而言在github上的
可执行文件的包没有go.mod也可以,你只需要在本地开发的时候有go.mod即可。然后这个go.mod 中的名称不跟package一样也可以
因为别人是不会再引用你的包的了。但是如果你的包有子包,那么你还是应该把你的包go.mod文件里的 module 后面规规矩矩的写例如

module github.com/XXX/add

然后别人引用的时候
import(
"gitub.com/xxx/ddd/app" // app 是子包 即可。
)

我go get的包,但是并没有在我的项目中使用,我该怎么处理我的go.mod

举个例子,你要拉取一个在github上的包,这个包呢,是一个可执行的包(main包)然后你需要在一个有go.mod的项目中使用go get才能拉下来,然后不出意外你的这个拉取记录就会出现在go.mod上,你不想让他出现该怎么办呢?很简单使用 go mod tidy就可以从go.mod 中删除。

我无法使用goalng.org/x的包我该怎么办

例如:
你本地的包要引入 golang.org/x/net/html
但是被封了,那么你可以使用github上的镜像包 例如说是 github.com/golang/x/net/html

在你的项目的go.mod 中 加入 replace golang.org/x/net/html => github.com/golang/x/net/html
但是一般你科学上网不就行了吗。。

我该怎么处理我的子包和我的包的关系

当我的文件夹的名称跟我的package写的包名不一样怎么办

要记得 一个文件夹(包)内的package 名称必须相同,但是可以不跟文件夹的名称一样,使用的时候其实很不爽就是了
不过也可以用 用法是

比如一个包 它的文件夹是 app 但是 package中的名称是 app1 那么可以这么用

imoirt "github.com/xxx/app" //  这个地方要跟文件夹的名称保持一致 其实就是跟路径保持一致
func dd(){
app1.xxx// 这里要跟真实的package保持一致 你看 得不偿失吧 所以 文件夹的名称要跟package的名称保持一致

}

注意

你的包如果存放在github上 你的包的go.mod module后面一定是github.com/xxx/xxx不能直接写成 xxx 这样的话
go mod 无法获得包 错误是parsing go.mod: unexpected module path "test" go: error loading module requirements
总结:

The commands are:

    download    download modules to local cache
    edit        edit go.mod from tools or scripts
    graph       print module requirement graph
    init        initialize new module in current directory
    tidy        add missing and remove unused modules
    vendor      make vendored copy of dependencies
    verify      verify dependencies have expected content
    why         explain why packages or modules are needed


上一篇 下一篇

猜你喜欢

热点阅读