如何在Golang build中使用-ldflags -X设置包变量

qcbq4gxm  于 2022-12-07  发布在  Go
关注(0)|答案(3)|浏览(233)

我正在使用Go 1.9.2创建一个应用程序,并试图在构建过程中使用ldflags -X选项向其添加一个版本字符串变量。
我已经在我的main包中设置了一个Version变量,使用了:-ldflags "-X main.Version=1.0.0",但是我真正需要的是在我的config包中设置Version变量,而不是main变量。这可能吗?
下面是我的构建命令:
go build -ldflags "-X config.Version=1.0.0" -o $(MY_BIN) $(MY_SRC)

ippsafx7

ippsafx71#

引用Command link的文档:

-X importpath.name=value
    Set the value of the string variable in importpath named name to value.
    Note that before Go 1.5 this option took two separate arguments.
    Now it takes one argument split on the first = sign.

所以它可以用于任何包,而不仅仅是main包,但是你必须指定完整的 import path,而不仅仅是包名。
例如,如果您的config软件包位于$GOPATH/src/my/package/config,则使用以下命令:

go build -ldflags "-X my/package/config.Version=1.0.0" -o $(MY_BIN) $(MY_SRC)
mrphzbgm

mrphzbgm2#

这里有一个简单的例子,希望它能澄清和帮助如何轻松地做到这一点:
为应用程序创建目录:

$ mkdir app && cd app

创建一个子目录config

$ mkdir config

添加以下文件。该文件应位于app/config/vars.go下:

package config

var Version string 

var BuildTime string 
//todo: can add as many as build vars

在根app/中,添加主包main.go

package main

import (
    "fmt"
    "app/config"
)

func main() {
    fmt.Println("build.Version:\t", Version)
    fmt.Println("build.Time:\t", build.BuildTime)
}

现在是构建的时候了:
go build -ldflags "-X 'app/config.Version=0.0.1' -X 'app/config.BuildTime=$(date)'"
构建完成后,您可以立即运行应用程序:

$ ./app 
Version:     0.0.1
build.Time:  Sat Jul  4 19:49:19 UTC 2020

最后,您有时可能需要探索您没有自己编写代码的特定应用在ldflags中提供了什么,您可以使用go tool附带的nm列出所有ldflags
只需构建应用程序,然后使用go tool nm列出所有链接器标志。

$ go build -o app 
$ go tool nm ./app

仍然有任何问题或任何东西需要进一步澄清?请随时留下评论,我会尽快给你回复。

bksxznpy

bksxznpy3#

添加(未初始化的字符串)变量,构建二进制文件,然后执行

$ go tool nm <your binary> | grep <your variable>

它将显示如下内容

101aa3820 B <import path>/config.Version

这就是你要找的导入路径

go build -ldflags "-X <import path>/config.Version=1.0.0" -o $(MY_BIN) $(MY_SRC)

相关问题