GolangNote

Golang笔记

Go Modules 使用备忘

Permalink

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

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

初始化

对于新建项目使用 go module

Bash: GO111MODULE
1
2
3
4
5
6
$ export GO111MODULE=on
    
$ go mod init github.com/you/hello
    
// go build 会将项目的依赖添加到 go.mod 中
$ go build 

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

Bash: go mod init
1
2
3
4
5
6
7
$ export GO111MODULE=on

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

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

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

项目的打包

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

Bash: 项目打包
1
2
3
4
5
6
7
8
9
10
#!/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 将特定的库替换成其他库:

Go: replace
1
2
3
replace (
    golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)

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

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

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

什么情况下使用

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

go mod 命令一览

go mod 命令一览

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

本文网址: https://golangnote.com/topic/268.html 转摘请注明来源

Related articles

Write a Comment to "Go Modules 使用备忘"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.20 Processed in 1ms