如前面写的 hello.go 示例,我们写完Go程序后,可以通过go run hello.go
运行这个go文件,但是要分发和部署一个Go应用的话,是不能用go run
这种方式来部署的,所以我们要把我们的应用项目或者模块进行build(构建)成二进制文件后部署到相应机器上。
以 hello为示例
$ mkdir greeter
$ cd greeter
$ touch hello.go
把我们之前写的hello.go复制进去
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
然后执行go run hello.go
确认运行可以正常输出Hello World!
Go 程序和库是围绕模块的核心概念构建的。模块包含有关程序使用的库以及要使用的这些库的版本的信息。Go模块创建可以使用go mod init
命令进行创建
$ go mod init greeter
执行成功后产生一下提示,go mod tidy
以便在将来更改时更新此模块的要求,并且目录下会产生一个对应的go.mod文件
go: creating new go.mod: module greeter
go: to add module requirements and sums:
go mod tidy
模块文件创建成功后,我们可以在这个文件夹下执行go build
构建二进制文件,如果不指定参数,默认构建当前目录下所有的*.go文件,go build 常见编译选项:
参数 说明
-o 可执行文件名
-a 强制重新编译所有包
-p 并行编译所使用的CPU核数量
-v 显示待编译包名字
-n 仅显示编译命令,但不执行
-x 显示正在执行的编译命令
-work 显示临时工作目录,完成后不删除
-race 启动数据竞争检查
-gcflags 编译器参数
-ldflags 链接器参数
gcflags 常见参数有:
参数 说明
-B 禁用越界检查
-N 禁用优化
-l 禁用内联
-u 禁用unsafe
-S 输出汇编代码
-m 输出优化信息
ldflags 常见参数有:
参数 说明
-s 禁用符号表
-w 禁用DRAWF调试信息
-X 设置字符串全局变量值
-H 设置可执行文件格式
咱们这个hello.go比较简单,使用go build即可
$ go build
$ ls
go.mod greeter hello.go
可以看到生成了一个greeter
文件,执行./greeter
$ ./greeter
Hello World!
go build -gcflags "all=-N -l" -o greeter hello.go
go build -ldflags -s -w -o greeter hello.go
每次发版都需要一个版本信息,通过配置文件或者人工修改版本号比较麻烦,而且容易忘记,恰好go编译的时候允许注入一个变量进去,然后使用CICD或者编译脚本,配合 -ldflags -X
信息设置字符串全局变量值
看下简化的小例子
package main
import (
"fmt"
)
var MinVersion string
func main() {
fmt.Println(fmt.Sprintf("Version: %s", MinVersion))
}
保存上面的go文件后,使用以下命令进行编译,其中的版本号可以利用cicd或者git分支和版本进行动态设置,做到自动设置版本
go build -ldflags "-X 'main.MinVersion=1.0.0.1'" -o main.exe main.go
上面内容为如何构建我们Go程序的二进制可执行文件,可执行文件有助于分发、部署和测试,但它们还不能从其源目录之外执行,如果想在shell 或者其他语言中调用这个程序,我们可以使用go install
安装到系统中,执行go install
会把这个应用安装到$GOPATH/bin
路径下,这样在这个环境中任何一个地方执行greeter
都可以获得Hello World!
$ go install
$ ls $GOPATH/bin
dlv gomodifytags goplay gopls gotests greeter impl staticcheck
- 目录
- 上一页 2.3 如何调试Go应用
- 下一页 2.5 gofmt(格式化代码工具)