main.go如下:
package main
func main() {
println("hello world")
}
Makefile如下:
flags=-X main.version=1.5.0
build:
go build -ldflags "$(flags)" -o main main.go
然后我运行make
,并得到主文件。
运行 ./main -v
后,我得到:
hello world
为什么不显示1.5.0
?
go版本是go版本go1.18 darwin/arm64
,当我运行go version -m main
时,我得到:
main: go1.18
path command-line-arguments
build -compiler=gc
build -ldflags="-X main.version=1.5.0"
build CGO_ENABLED=1
build CGO_CFLAGS=
build CGO_CPPFLAGS=
build CGO_CXXFLAGS=
build CGO_LDFLAGS=
build GOARCH=arm64
build GOOS=darwin
我对ldflags
有误解。其工作原理如下:
package main
import (
"fmt"
"os"
)
var (
version string
)
func main() {
args := os.Args
if len(args) == 2 && (args[1] == "--version" || args[1] == "-v") {
fmt.Printf("project version: %s \n", version)
return
}
}
$ ./main -v
project version: 1.5.0
最佳答案
您使用 ldflags (version
) 设置的变量必须在包级别的包中声明。 -v
的处理您必须自己实现。
package main
import "flag"
var version string
func main() {
var vFlag bool
flag.BoolVar(&vFlag, "v", false, "show version")
flag.Parse()
if vFlag {
println(version)
} else {
println("hello world")
}
}
go build -ldflags "-X main.version=1.5.0" -o main main.go
./main -v
# 1.5.0
./main
# hello world
关于go - 使用 ldflags 为二进制文件提供在 golang 中不起作用的版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71626755/