【golang】hello go mod

1.Go mod简介

Go mod是官方推荐的包管理方式,开始于go1.11,在go1.12版本基本稳定,go1.13之后开始默认开启。

2.Go mod上手实践

  1. 在项目主目录下,执行go mod init产生go.mod文件(项目主目录为空目录,无实例.go)

    [root@hik hello]# pwd
    /home/projects/example/hello #本项目主目录,创建空目录/home/projects/example/hello
    [root@hik hello]# go mod init example/hello
    go: creating new go.mod: module example/hello #指定模块名称example/hello
    [root@hik hello]# ll 
    total 16
    -rw-r--r--. 1 root root  30 Dec  3 18:27 go.mod #可见已有go.mod生成
    [root@hik hello]# cat go.mod  #查看go.mod内容
    module example/hello
    
    go 1.20
    
    
  2. 创建实例文件hello.go,生成go.sum文件(#发现这样需要手动获得依赖,当依赖很多时,重复的工作很多,考虑到一般我们的开发环境 在IDE创建实例go 文件后,上传到主目录下,然后再执行go mod tidy 生成go.sum文件,会减少很多工作)

    /*
    [root@hik hello]# go run hello.go 
    hello.go:4:8: no required module provides package rsc.io/quote; to add it:
    	go get rsc.io/quote      #发现这样需要手动获得依赖,当依赖很多时,重复的工作很多,所以注释掉这样的操作
    [root@hik hello]# ll
    total 8
    -rw-r--r--. 1 root root 30 Dec  3 18:58 go.mod
    -rw-r--r--. 1 root root 93 Dec  3 18:37 hello.go
    [root@hik hello]# cat go.mod 
    module example/hello
    
    go 1.20
    [root@hik hello]# cat hello.go 
    package main
    
    import "fmt"
    import "rsc.io/quote"
    func main() {
        fmt.Println(quote.Go())
    }
    [root@hik hello]# go get rsc.io/quote   #添加依赖包
    go: added golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
    go: added rsc.io/quote v1.5.2
    go: added rsc.io/sampler v1.3.0
    */
    //创建实例go 文件后,上传到主目录下,然后再执行go mod tidy 生成go.sum文件
    [root@hik hello]# go mod tidy
    go: finding module for package rsc.io/quote
    go: found rsc.io/quote in rsc.io/quote v1.5.2
    [root@hik hello]# cat go.sum 
    golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
    golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
    rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
    rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
    rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
    rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
    [root@hik hello]# cat go.mod 
    module example/hello
    
    go 1.20
    
    require rsc.io/quote v1.5.2
    
    require (
    	golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
    	rsc.io/sampler v1.3.0 // indirect
    )
    
  3. go build编译生成可执行文件

    [root@hik hello]# go build hello.go 
    [root@hik hello]# ll
    total 2056
    -rw-r--r--. 1 root root     173 Dec  3 19:13 go.mod
    -rw-r--r--. 1 root root     499 Dec  3 19:13 go.sum
    -rwxr-xr-x. 1 root root 2092882 Dec  3 19:21 hello
    -rw-r--r--. 1 root root      93 Dec  3 18:37 hello.go
    [root@hik hello]# ./hello 
    Don't communicate by sharing memory, share memory by communicating.
    [root@hik hello]# date
    Sun  3 Dec 19:22:02 CST 2023
    

4.导入模块下的包
在这里插入图片描述

3.Go mod命令

  • go help mod查看帮助。
  • go mod init <项目模块名称>初始化模块,会在项目根目录下生成 go.mod 文件。参数<项目模块名称>是非必写的,但如果你的项目还没有代码编写,这个参数能快速初始化模块。如果之前使用其它依赖管理工具(比如dep,glide等),mod会自动接管原来依赖关系。
  • go mod tidy根据go.mod文件来处理依赖关系。
  • go mod vendor将依赖包复制到项目下的 vendor 目录。建议一些使用了被墙包的话可以这么处理,方便用户快速使用命令go build -mod=vendor编译。
  • go list -m all显示依赖关系。go list -m -json all显示详细依赖关系。
  • go list -m -versions <path>显示包有哪些已发布版本
  • go mod download <path@version>下载依赖。参数<path@version>是非必写的,path是包的路径,version是包的版本。
  • 其它命令可以通过go help mod来查看。

4.Go mod文件介绍

1) go.mod

go.mod 提供了module, requirereplaceexclude 四个命令

  • module 语句指定包的名字(路径)
  • require 语句指定的依赖项模块
  • replace 语句可以替换依赖项模块
  • exclude 语句可以忽略依赖项模块

2) go.sum

go.sum 的每一行都是一个条目,大致是这样的格式:

<module> <version>/go.mod <hash>
<module> <version> <hash>
<module> <version>/go.mod <hash>

备注:其中module是依赖的路径,version是依赖的版本号。hash是以h1:开头的字符串,表示生成checksum的算法是第一版的hash算法(sha256)

  • 项目没有打 tag,会生成一个版本号,格式如下:v0.0.0-commit日期-commitID 引用一个项目的特定分支,比如 develop branch,也会生成类似的版本号: v当前版本+1-commit日期-commitID
  • 项目有用到 go module,那么就是正常地用 tag 来作为版本号。 如果项目打了 tag,但是没有用到 go module,为了跟用了 go module 的项目相区别,需要加个 +incompatible 的标志。比如:<module>+<version>+incompatible/go.mod+<hash>
  • 对于使用了 v2+ go module 的项目,项目路径会有个版本号的后缀。比如: <module/v2>+<version> + <hash>
// 没有打tag的场景
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
// 打tag的指定branch的场景
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
// 使用了go mod的场景
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
// 打tag的指定branch的场景
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
// 使用了go mod的场景
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

5.总结

Go语言在使用第三方包时会自动生成go.sum文件,该文件用于记录当前项目所使用的所有依赖包的版本信息和哈希值等校验信息。下面是go.sum文件的生成方式:

  1. 在项目根目录下执行go mod init命令,该命令会生成go.mod文件,其中包含了项目的模块名称和依赖关系。
  2. 通过执行go mod tidy命令,Go会自动解析项目的依赖关系,生成和更新go.mod和go.sum文件。其中,go.sum文件记录了所有依赖包的版本信息和哈希值等校验信息。

在项目开发过程中,每次新增、删除或更新依赖包时,都需要重新执行go mod tidy命令,以便更新go.sum文件。

需要注意的是,go.sum文件不应该手动编辑,而应该由Go自动生成和更新,以确保依赖包的版本和哈希值等信息的正确性。

6.参考

go-sum-mod-gen
go.sum怎么生成的
go.mod的简单实践

  • 37
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值