猿问

使用 ldflags 为二进制文件提供一个在 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,得到主文件。


在我跑步之后./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


沧海一幻觉
浏览 103回答 1
1回答

慕田峪7331174

您使用 ldflags ( version) 设置的变量必须在包级别的包中声明。您自己的处理-v必须执行。package mainimport "flag"var version stringfunc 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
随时随地看视频慕课网APP

相关分类

Go
我要回答