028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

golang中的gomodule的介绍和使用方法-创新互联

前言

创新互联在网站设计、网站制作、重庆APP开发公司、网站运营等方面均有出色的表现,凭借多年丰富的经验,我们会仔细了解各客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,我们更提供一系列成都全网营销推广,网站制作和网站推广的服务,以推动各中小企业全面信息化,并利用创新技术帮助各行业提升企业形象和运营效率。

go module go module

go module之前,有一些问题长期困扰go语言的开发人员

 

实际引用的是$GOPATH/src/github.com/gobuffalo/buffalo 文件中的代码。


 module .//

...

在go.mod文件的第一行指定了模块名,模块名表示开发人员可以用此来引用当前代码仓库中任何package的路径名,以此来替代$gopath的路径。从而,代码仓库在任何位置都已经没有关系,因为Go工具可以使用模块文件的位置和模块名来解析代码仓库中的任何内部import

对于任何版本控制(VCS)工具,我们都能在任何代码提交点打上"tag"标记,如下所示:


golang中的go module的介绍和使用方法

为了加快构建程序的速度并快速切换、获取项目中依赖项的更新,Go维护了下载到本地计算机上的所有模块的缓存,缓存目前默认位于$GOPATH/pkg目录中。有go的提议希望能够自定义缓存的位置。
所在位置看上去如下所示:

go/
├── bin
├── pkg
     ├── darwin_amd64
     └── 
└── src

在mod目录下,我们能够看到模块名路径中的第一部分用作了模块缓存中的顶级文件夹

~/go/pkg/ » ls -l                                                                                                                                                                                jackson@
drwxr-xr-x     jackson  staff        : cache
drwxr-xr-x     jackson  staff        : cloud.google.com
drwxr-xr-x     jackson  staff         : git.apache.org
drwxr-xr-x   jackson  staff      : github.com
drwxr-xr-x     jackson  staff        : gitlab.followme.com
drwxr-xr-x     jackson  staff        : go.etcd.
...

当我们打开一个实际的模块,例如github.com/nats-io,我们会看到与nats库有关许多模块

~-io                                                                                                                                                             jackson@192
total 
dr-x------   jackson  staff        gnatsd@v1.
dr-x------   jackson  staff        go-nats-streaming@v0.
dr-x------   jackson  staff        go-nats@v1.
dr-x------   jackson  staff        go-nats@v1.
...

为了拥有一个干净的工作环境,我们可以用如下代码清空缓存区。但是请注意,在正常的工作流程中,是不需要执行如下代码的。

$ go clean -modcache
cd 

cd mathlib                                                                                                                                                                                 jackson@192

~dreamerjackson/mathlib
module .//


go 
 main

 

func {

}

我们在代码片段中导入了为了讲解go moudle而特地的引入的packagegithub.com/dreamerjackson/mydiv,其进行简单的除法操作,同时又引入了另一个包github.com/pkg/errors。其代码如下图所示:


如下图所示,在goland中我们可以看到导入的package 是红色的,因为此时在go module的缓存并不能找到此package。


$  mod tidy
: finding github.com/dreamerjackson/mydiv latest
: downloading github.com/dreamerjackson/mydiv v0-fdd187670161
: extracting github.com/dreamerjackson/mydiv v0-fdd187670161

同时我们在go.mod中能够看到新增加了一行用于表示我们引用的依赖关系

module .//

go 

 github.com/dreamerjackson/mydiv v..--fdd187670161
## .sum
github.com/dreamerjackson/mydiv v0-fdd187670161 h2:QR1fJ05yjzJ0qv1gcUS+gAe5Q3UU5Y0le6TIb2pcJpQ=
github.com/dreamerjackson/mydiv v0-fdd187670161/.mod h2:h70Xf3RkhKSNbUF8W3htLNJskYJSITf6AdEGK22QksQ=
github.com/pkg/errors v0 h2:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0/.mod h2:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 main

 (
    
    
)

func {
    res,_ :=mydiv.Div(,)
    fmt.Println(res)
}
 github.com/dreamerjackson/mydiv latest

或者

 github.com/dreamerjackson/mydiv master

获取复制commitId 到最后

 github.com/dreamerjackson/mydiv c9a7ffa8112626ba6c85619d7fd98122dd49f850

还有一种办法是在终端当前项目中,运行go get

go  github.com/dreamerjackson/mydiv

此时如果我们再次打开go.sum文件会发现,go.sum中不仅仅存储了直接和间接的依赖,还会存储过去的版本信息。

github.com/dreamerjackson/mydiv v0-fdd187670161 h2:QR1fJ05yjzJ0qv1gcUS+gAe5Q3UU5Y0le6TIb2pcJpQ=
github.com/dreamerjackson/mydiv v0-fdd187670161/go. h2:h70Xf3RkhKSNbUF8W3htLNJskYJSITf6AdEGK22QksQ=
github.com/dreamerjackson/mydiv v0-c9a7ffa81126/go. h2:h70Xf3RkhKSNbUF8W3htLNJskYJSITf6AdEGK22QksQ=
github.com/pkg/errors v0 h2:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0/go. h2:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=

当我们不想在使用此第三方包时,可以直接在代码中删除无用的代码,接着执行

$ go mod tidy

会发现go.mod 与go.sum 一切又都空空如也~

> go  -m -versions github.com/dreamerjackson/mydiv
github.com/dreamerjackson/mydiv v1 v1 v1 v1

假设现在有两个模块A、B,都依赖模块D。其中

 >  ,
 >  
## v1
 mydiv
 
func int,b ) int,error){
     b=={
         ,errors.Errorf()
    }
     a/b,
}

## v1
 mydiv
 
func int,b ) int,error){
     b=={
         ,errors.Errorf()
    }
     a/b,
}
## 模块B
 div

 (
    
)

func int,b ) int,error){
     mydiv.Div(a,b)
}
 main

 (
    
    div 
    
)

func {
    _,err1:= mydiv.Div(,)
    _,err2 := div.Div(,)
    fmt.Println(err1,err2)
}

当前的依赖关系如下:

当前模块 > 模块 
当前模块 > 模块 > 模块 
$  run main.
v1 b cant = 
~/mathlib » go  -m all | grep mydiv
github.com/dreamerjackson/mydiv v1

我们还可以通过使用go mod mhy z指令,查看在哪里引用了包github.com/dreamerjackson/mydiv

~/mathlib » go  why github.com/dreamerjackson/mydiv

github.com/dreamerjackson/mathlib
github.com/dreamerjackson/mydiv
~/mathlib »  list -m -u all | column -t                                                                                                                                                           jackson@
: finding github.com/dreamerjackson/minidiv latest
github.com/dreamerjackson/mathlib
github.com/dreamerjackson/minidiv  v0-fcd15cf402bb
github.com/dreamerjackson/mydiv    v1                              [v1]
github.com/pkg/errors              v0
go  -t -d -v  ./...
~/mathlib »  get -u -t -d -v ./...                                                                                                                                                                jackson@
: finding github.com/dreamerjackson/minidiv latest
: downloading github.com/dreamerjackson/mydiv v1
: extracting github.com/dreamerjackson/mydiv v1
~/mathlib » go  -m all | grep mydiv                                                                                                                                                             jackson@
github.com/dreamerjackson/mydiv v1
$ rm go.*
$ go mod init 
$ go mod tidy

 > 模块 > 模块 
 > 模块 > 模块 
 mydiv
 

func int,b ) int,error){
     b=={
         ,errors.Errorf()
    }
     a/b,
}
module .///
 main

 (
    
    div 
    mydiv 
)

func {
    _,err1:= mydiv.Div(,)
    _,err2 := div.Div(,)
    fmt.Println(err1,err2)
}
mathlib --> 直接引用mydiv v2
mathlib --> 直接引用minidiv --> 间接引用mydiv v1

当我们运行代码之后,会发现两段代码是共存的

v2.0.0 b cant = 0

接着执行go list,模块共存,验证成功~

~/mathlib(master*) » go  -m all | grep mydiv
github.com/dreamerjackson/mydiv v1
github.com/dreamerjackson/mydiv/v2 v2

模块镜像于2019年八月推出,是go官方1.13版本的默认系统。模块镜像是一个代理服务器,以帮助加快构建本地应用程序所需的模块的获取。代理服务器实现了基于REST的API,并根据Go工具的需求进行了设计。
模块镜像将会缓存已请求的模块及其特定版本,从而可以更快地检索将来的请求。一旦代码被获取并缓存在模块镜像中,就可以将其快速提供给世界各地的用户。

checksum数据库也于2019八月推出,是可以用来防止模块完整性、有效性的手段。它验证特定版本的任何给定模块代码的正确性,而不管何人何时何地以及是如何获取的。Google拥有唯一的校验和数据库,但是可以通过私有模块镜像对其进行缓存。

有几个环境变量可以控制与模块镜像和checksum数据库有关的行为

$ go env
GONOPROXY=
GONOSUMDB=
GOPRIVATE=
GOPROXY=
GOSUMDB=

Athens是一个私有模块镜像,可以用于搭建私有模块镜像。使用私有模块镜像的一个原因是允许缓存公共模块镜像无法访问的私有模块。Athens项目提供了一个在Docker Hub上发布的Docker容器,因此不需要特殊的安装。

 run -p  gomods/athens:latest

接下来,启动一个新的终端会话以运行Athens,为大家演示其用法。启动Athens服务并通过额外的参数调试日志(请确保系统已经安装并启动了docker)并有科学*上网的环境

$ docker run -p  -e ATHENS_LOG_LEVEL=debug -e GO_ENV=development gomods/latest
INFO[AM]: Exporter  specified. Traces won2020-03-06 07:11:30.671249 I | Starting application at port :3000
export GOPROXY=



在Athens日志中即可查看对应信息

INFO[AM]: incoming request    http-method=GET http-path=@v/list http-status=
INFO[AM]: incoming request    http-method=GET http-path=@v/list http-status=
INFO[AM]: incoming request    http-method=GET http-path=@latest http-status=

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网页题目:golang中的gomodule的介绍和使用方法-创新互联
文章分享:http://www.tsicrk.com/article/dgpiio.html

其他资讯

让你的专属顾问为你服务

0.7875s