Go构建和发布

Go Build

减小发布包体积

在我的项目构建中,大约小5M左右

go build -ldflags '-s -w'
go tool link
  • -s disable symbol table
    • go tool nm不可用
  • -w disable DWARF generation
    • gdb调试不可用
    • pprof不可用

使用embed内嵌文件

  • 支持string、byte数组、FS三种类型
  • embed.FS 可使用 .ReadFile("static/index.html")读取字节数组
package main
import 	_ "embed"

//go:embed version.txt
var version string
var versionByte []byte

// 此处通常处理文件夹
//go:embed static
var embededFiles embed.FS

出错时去掉文件路径

go build -trimpath
go help build

-trimpath

	remove all file system paths from the resulting executable.
	Instead of absolute file system paths, the recorded file names
	will begin either a module path@version (when using modules),
	or a plain import path (when using the standard library, or GOPATH).

构建时指定

-X 的使用:

flags="-X 'main.goversion=$(go version)'"
go build -ldflags "$flags" -x main.go
./main -v

go mod

  • go mod tidy 自动下载依赖,并放到cache
# 任何导致依赖关系变化的构建会失败(因为build会自动更新依赖)
go build -mod=readonly 

# 使用vendor版本构建
go build -mod=vendor

GoReleaser自动打包

安装和使用

go install github.com/goreleaser/goreleaser@latest
goreleaser init

定制话配置文件

.goreleaser.yaml

before:
  hooks:
    # You may remove this if you don't use go modules.
    - go mod tidy
builds:
  - main: ./hrp/cmd/cli/main.go
    env:
      - CGO_ENABLED=0
    goos:
      - linux
      - windows
    goarch:
      - amd64
    flags: -trimpath
archives:
  - format: binary

构建

goreleaser release --snapshot --rm-dist

参考