go的modules怎么使用(go,modules,开发技术)

时间:2024-05-08 07:51:14 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    1.go modules的基本介绍

    1.1 提供的命令

    在go环境的shell中执行go mod help查看命令和说明。

    Usage:gomod<command>[arguments]Thecommandsare:downloaddownloadmodulestolocalcacheediteditgo.modfromtoolsorscriptsgraphprintmodulerequirementgraphinitinitializenewmoduleincurrentdirectorytidyaddmissingandremoveunusedmodulesvendormakevendoredcopyofdependenciesverifyverifydependencieshaveexpectedcontentwhyexplainwhypackagesormodulesareneeded

    1.2 提供的环境变量

    go env查看go的环境变量,在所有go提供的环境变量中,有一个是和go mod相关的。

    GO111MODULE="on"GOPROXY="https://goproxy.cn,direct"GONOPROXY="git.example.com,x1"GONOSUMDB="git.example.com,x1"GOPATH="/home/go-project/"GOPRIVATE="git.example.com,x1"GOSUMDB="sum.golang.org"#省略其余环境变量...
    1.2.1 说明

    1) GO111MODULE

    go语言提供GO111MODULE环境变量三个值,用于GO111MODULE的开关:

    • auto:只要项目中包含了go.mod这个文件,就启动该项目的go modules,在 Go1.11 至 Go1.14 中仍然是默认值。

    • on:启动go modules

    • off:关闭go modules

    2) GOPROXY

    go env中默认的代理是GOPROXY="https://proxy.golang.org,direct",但是在国内是无法访问的,这里需要设置成国内的代理地址GOPROXY="https://goproxy.cn,direct"

    GOPROXY的值是一个以英文逗号 “,” 分割的 Go 模块代理列表,允许设置多个模块代理,假设你不想使用,也可以将其设置为 “off” ,这将会禁止 Go 在后续操作中使用任何 Go 模块代理。

    direct

    实际上 “direct” 是一个特殊指示符,用于指示 Go 回源到模块版本的源地址去抓取(比如 GitHub 等),场景如下:当值列表中上一个 Go 模块代理返回 404 或 410 错误时,Go 自动尝试列表中的下一个,遇见 “direct” 时回源,也就是回到源地址去抓取,而遇见 EOF 时终止并抛出类似 “invalid version: unknown revision&hellip;” 的错误。

    在cmd中执行set GO111MODULE=on

    go的modules怎么使用

    3)GONOPROXY/GONOSUMDB/GOPRIVATE

    这三个环境变量都是用在当前项目依赖了私有模块,例如像是你公司的私有 git 仓库,又或是 github 中的私有库,都是属于私有模块,都是要进行设置的,否则会拉取失败。对于一些自己的私有模块代码,需要在GOPRIVATE上设置,在拉取时会提示输入用户名和密码。

    可以设置多个,用英文的逗号分隔开;或者用通配符等

    goenv-wGOPRIVATE="git.example.com,github.com/eddycjy/mquote"goenv-wGOPRIVATE="*.example.com" #通配example.com的域名

    2.go modules的基本使用

    开启go modules后,就可以创建项目并且生成mod文件,来管理项目的所有依赖了。以下是go env环境的配置:

    GO111MODULE="auto"GOARCH="amd64"GOBIN="/go/bin/"GOCACHE="/root/.cache/go-build"GOENV="/root/.config/go/env"GOEXE=""GOFLAGS=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOINSECURE=""GONOPROXY=""GONOSUMDB=""GOOS="linux"GOPATH="/home/go-project/"GOPRIVATE=""GOPROXY="https://goproxy.cn,direct"GOROOT="/go"GOSUMDB="sum.golang.org"GOTMPDIR=""GOTOOLDIR="/go/pkg/tool/linux_amd64"GCCGO="gccgo"AR="ar"CC="gcc"CXX="g++"CGO_ENABLED="1"GOMOD=""CGO_CFLAGS="-g-O2"CGO_CPPFLAGS=""CGO_CXXFLAGS="-g-O2"CGO_FFLAGS="-g-O2"CGO_LDFLAGS="-g-O2"PKG_CONFIG="pkg-config"GOGCCFLAGS="-fPIC-m64-pthread-fmessage-length=0-fdebug-prefix-map=/tmp/go-build940953411=/tmp/go-build-gno-record-gcc-switches"

    设置了GOPATH/home/go-project/,并且代理指向了国内的代理地址,防止国外镜像无法访问的情况。

    2.1 初始化项目

    $GOPATH目录下创建一个新的项目example.com/mycount/helloexample.com模拟github.com,mycount模拟账号,hello是最终的项目名称。目录和文件结构:

    go的modules怎么使用

    2.1.1 初始化.mod文件

    hello目录下执行go mod init example.com/mycount/hello初始化hello项目的mod文件,如下:

    go的modules怎么使用

    执行完初始化操作后生成了一个go.mod的文件,里面只记录了2行:

    go的modules怎么使用

    • module:用于定义当前项目的模块路径

    • go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用

    2.1.2 简单一个示例

    hello目录下写一个main.go的文件,里面用了一个第三方的库。

    packagemainimport( "net/http" "github.com/gin-gonic/gin" "github.com/json-iterator/go")typerespstruct{ Statusint`json:"status"` Messagestring`json:"message"`}funcmain(){ router:=gin.Default() router.GET("/",hello()) iferr:=router.Run(":6060");err!=nil{ panic(err) }}funchello()gin.HandlerFunc{ returnfunc(context*gin.Context){ strResp,_:=jsoniter.MarshalToString(resp{ Status:http.StatusOK, Message:"success", }) context.String(http.StatusOK,strResp) }}

    hello目录下执行go get命令,拉取依赖库:

    go的modules怎么使用

    拉取依赖之后生成了一个go.mod和go.sum文件,go.mod文件:

    go的modules怎么使用

    go.sum的内容:

    go的modules怎么使用

    同时在$GOPATH目录下多了一个pkg文件,里面有拉取的文件依赖。这个文件是一个全局的缓存,

    2.1.3 go modules的go get

    在拉取项目依赖时,你会发现拉取的过程总共分为了三大步,分别是 finding(发现)、downloading(下载)以及 extracting(提取), 并且在拉取信息上一共分为了三段内容:

    go的modules怎么使用

    需要注意的是,所拉取版本的 commit 时间是以UTC时区为准,而并非本地时区,同时我们会发现我们 go get 命令所拉取到的版本是 v0.0.0,这是因为我们是直接执行 go get -u 获取的,并没有指定任何的版本信息,由 Go modules 自行按照内部规则进行选择。

    go的modules怎么使用

    那么我想选择具体版本应当如何执行呢,如下:

    go的modules怎么使用

    3.使用go mod发布自己的包

    3.1 发布公开的包

    公开的发布包无需修改go env中的一些环境变量,默认的环境变量即可

    3.1.1 包的实现

    假设我们有一个模块需要提供给第三方使用,并且这个包是发布在了gittee上,假设我在gitee上得账号是gitee.com\luciferofwg。我们后期会根据迭代或者功能维护版本,每当有更新或者升级的时候就发布最新的版本,版本遵循语义化版本定义。什么是语义化版本
    这个包中包含一个函数,用于打印一句话,如下所示:

    //hello.gopackagehelloimport"fmt"funcSayHello(){ fmt.Println("helloworld")}

    在GOPATH下新建目录hello,在命令行下进入hello目录,执行go mod init来生成go mod文件,如下:

    go的modules怎么使用

    生成的包名为gitee.com/luciferofwg/hello,后期在引用这个包时就import 这个包名。
    hello仓库提交到gitee上,完成发布包的第一个阶段。

    3.1.2 包的发布

    经过上一步骤,在仓库中就有了一个名为hello的公开仓库,如下:

    go的modules怎么使用

    假如我们认为这个版本是稳定可靠的,这时候我们需要发布一个可以使用的版本,gitee发布的流程如下:
    点击仓库中右侧的创建按钮,在弹出的页面中创建发行版本号,填写完毕后点击创建发行版本完成发布。

    图1 创建发行版本

    go的modules怎么使用

    图2 发行版本信息

    go的modules怎么使用

    图3 已创建的发行版本

    go的modules怎么使用

    到此我们发行了一个版本为v1.0.4的版本。

    3.1.3 包的使用

    对于已经发行的包,这里介绍如何使用它。首先定义一个名为test的包,因为test为调用的程序,因此我们初始化mod时直接按照程序的名字初始化,即:go mod test,完成初始化。如下:

    go的modules怎么使用

    test目录下编写如下代码:

    packagemainimport"gitee.com/luciferofwg/hello"funcmain(){ hello.SayHello()}

    然后再命令行中执行go mod tidy整理go mod,此时go mod会根据程序包的引用关系按照包名从互联网上拉去对应的包。执行完成后go.mod如下:

    go的modules怎么使用

    运行的结果:

    go的modules怎么使用

    需要注意的是:

    默认拉去的是最新的发布版本,如果想制定版本,只需要修改go.mod中require最后面的版本号即可。如何修改go.mod参考go help mod命令的edit项。

    3.2 发布私有包

    3.2.1 go env环境变量和git配置的修改

    1.go env环境变量的修改

    私有包和公开包的区别最大的区别是权限的和git拉去包的过程,这时候需要对go env中的一些参数修改。涉及到的一些参数
    GOINSECURE,GONOPROXY,GONOSUMDB,含义:
    GOINSECURE:如果代码仓库是自己搭建的,没有“合法”的证书,则需要配置这个信息
    GONOPROXY:在这个变量中配置的域名或者仓库地址不会走代理(我们在前面设置了cn的代理)
    GONOSUMDB:1.15后会对包进行校验,此处的配置和GONOPROXY的含义一样
    看一下我们的go env变量,之前已经修改过了,内容如下:

    go的modules怎么使用

    注:
    windows下修改时直接将上述的配置增加系统的环境变量即可,linux下在bash的配置文件中修改(具体修改可以自行搜索)。

    2.git配置的修改

    由于是私有的包,拉去时需要获取拉去的权限,默认的https或者http的方式需要密码。如果我们本地已经配置了对应的gitee上的私钥,且已经在gitee对应的账户上配置了权限,那么我们就可以通过git@xxx的方式访问私有的仓库。
    打开本地git的配置,windows下是c:\\user\\用户名\\.bashconfig文件,打开这个文件。增加以下代码:

    [url"git@gitee.com:"]insteadof=https://gitee.com

    表示访问https://gitee.com的过程替换为git@gitee.com:,即通过bash就可以访问私有库了。

    3.2.2 私有包的实现

    1.私有包实现

    我们创建一个私有的仓库,名为hi,包含一个函数SayHello,打印hello world。
    同样的,创建go.mod,实现SayHello函数,推送到gitee。

    图1 私有仓库hi

    go的modules怎么使用

    2.函数和源码

    //hi包的SayHello函数packagehiimport"fmt"funcSayHello(){ fmt.Println("hi,world")}

    hi包的go.mod

    go的modules怎么使用

    3.2.3 私有包的发布

    根据上述的源码,使用同样的方式发布版本。
    图1 发布的版本1.0.0

    go的modules怎么使用

    3.2.4 私有包的引用

    如果已经配置了go env的参数和git配置,使用的过程和公开包的使用是一样的。基于原来的版本,增加了一个hi包的函数引用和导入,在test目录下执行go mod tidy,就会自动拉取发布的包了。

    packagemainimport( "gitee.com/luciferofwg/hello" "gitee.com/luciferofwg/hi")funcmain(){ hello.SayHello() hi.SayHello()}

    test程序的go.mod如下:

    go的modules怎么使用

     </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
    本文:go的modules怎么使用的详细内容,希望对您有所帮助,信息来源于网络。
    上一篇:VUE怎么利用vue-print-nb实现打印功能下一篇:

    5 人围观 / 0 条评论 ↓快速评论↓

    (必须)

    (必须,保密)

    阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18