Golang笔记

Go Modules 使用备忘

简单说 Go Modules 就是包管理,从 go1.11 开始支持,可以不需要gopath存在,环境变量GO111MODULE,默认为 auto 项目存在 go.mod 则使用 go module ,否则使用GOPATH 和 vendor 机制。

这个解决的问题是:你引用的代码包上游变更不会直接影响你的项目,这显然是开始关心“包版本”了。遗憾的是依旧没有解决包管理的问题,比如不同的包依赖了同一个包的不同版本怎么办?版本间代码冲突怎么办?vendor 机制并没有解决,于是围绕 vendor/ 社区就出了几十个包管理工具,一时间百花齐放、百家争鸣、各有所长,导致 golang 的包管理生态变得有些混乱。

初始化

对于新建项目使用 go module:

$ export GO111MODULE=on
    
$ go mod init github.com/you/hello
    
// go build 会将项目的依赖添加到 go.mod 中
$ go build 

对于已有项目要改为使用 go module:

$ export GO111MODULE=on

// 创建一个空的 go.mod 文件
$ go mod init .

// 查找依赖并记录在 go.mod 文件中
$ go get ./...

go.mod 文件必须要提交到 git 仓库,但 go.sum 文件可以不用提交到 git 仓库(git忽略文件 .gitignore 中设置一下)。

项目的打包

首先需要使用 go mod vendor 将项目所有的依赖下载到本地 vendor 目录中然后进行编译,下面是一个参考:

#!/bin/bash

export GO111MODULE="on"
export GOPROXY="https://goproxy.io"
export CGO_ENABLED="0"
export GOOS="linux"
export GOARCH=amd64

go mod vendor
go build -ldflags "-s -w" -a -installsuffix cgo -o audit-webhook .

对于墙外的库

在go.mod中可以使用replace将特定的库替换成其他库:

replace (
    golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)

也可以使用阿里云的镜像站:

$ export GOPROXY="https://mirrors.aliyun.com/goproxy/"

$ export GOPROXY="https://goproxy.cn,direct"

什么情况下使用

一般是发布的开源程序,或私有源上使用这种方式管理依赖包。

go mod 命令一览

go mod 命令一览

使用方式不习惯就不用,萝卜白菜,各有所爱。

本文网址: https://golangnote.com/topic/268.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。如果你有任何问题可以在下面 留言
Be the first to comment!
Captcha image
Relative Articles