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

38

我正在使用Go 1.9.2创建一个应用程序,并尝试在构建过程中使用 ldflags -X 选项添加版本字符串变量。

我已经成功地在我的 main 包中设置了一个 Version 变量,方法是使用: -ldflags“-X main.Version = 1.0.0”,但是我真正需要的是将 Version 变量设置在我的 config 包中而不是 main 包。这可行吗?

以下是我的构建命令:

go build -ldflags“-X config.Version = 1.0.0” -o $(MY_BIN)$(MY_SRC)

3个回答

60

引用自Command link文档:

-X 导入路径.变量名=值
    将导入路径中名为变量名的字符串变量的值设置为value。
    注意,在Go 1.5之前,此选项需要两个单独的参数。
    现在它只需要一个参数,该参数在第一个等号处拆分。

因此,它可以用于任何包,而不仅仅是main包。但必须指定完整的导入路径,而不仅仅是包名称。

例如,如果您的config包位于$GOPATH/src/my/package/config,则使用以下命令:

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

只有在指定的包位于GOPATH或GOROOT下,这个操作才能生效吗? - user9591909
@Muddz 它也适用于模块,但您必须使用完整的模块名称。例如,模块 example.com/module 的子目录 config 将是 example.com/module/config,您可以使用 -X example.com/module/config.Version=1.0.0(似乎只有最后一个 . 决定了 importpathname 之间的分隔符)。 - kbolino
1
自此回答发布以来,-X 的文档已经更新,并添加了一个额外的警告:“仅当变量在源代码中声明为未初始化或初始化为常量字符串表达式时,此选项才有效。如果初始值设定项调用函数或引用其他变量,则 -X 将无效。” - kbolino

19

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

$ 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)

go tool: no such tool "rm" - Travis Bear
@TravisBear 很抱歉,是打错了,应该是 nm - mat007

16

以下是一个简单的例子,希望它能够阐明并帮助你轻松地完成:

为您的应用程序创建一个目录:

$ 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 

还有任何问题或需要更多澄清的地方吗?请在下方留言,我会尽快回复您。


go tool nm 大获成功!分享得好! - angryip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接