使用 ldflags 为二进制文件提供一个在 golang 中不起作用的版本

using ldflags for giving binary file a version not working in golang

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,得到主文件

在我 运行ing ./main -v 之后,我刚得到:

hello world

为什么不显示1.5.0

go版本是go version 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