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

标签 go

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/

相关文章:

ajax - 使用模板在 Golang 中创建加载更多按钮

go - 传递什么上下文来等待某事完成?

go - 看不到 struct Golang 的公共(public)函数

c - 如何将Golang的cgo与链接到math.h的C库一起使用?

google-app-engine - App Engine 运行 go 1.5,发行说明说 1.6

go - 如何在命名管道中的 EOF 后恢复读取

xml - Golang XML Unmarshal 只返回子节点的最后一个值

javascript - 实时推送通知 golang

oop - 如何实现功能共享相同逻辑的接口(interface)?

go - 为什么在尝试构建任何Go程序时出现重新声明的错误?