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

时间:2017-11-27 10:56:42

标签: go

我正在使用Go 1.9.2创建一个应用程序,我正在尝试在构建期间使用pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.not.include("string_you_want_to_search"); }); 选项向其添加版本字符串变量。

我已设法使用ldflags -X在我的Version包中设置main变量,但我真正需要的是设置-ldflags "-X main.Version=1.0.0"变量在我的Version包中,而不是config包中。这可能吗?

这是我的构建命令:

main

2 个答案:

答案 0 :(得分:17)

引自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包。但是,您必须指定完整的导入路径,而不仅仅是包名称。

E.g。如果您的config包位于$GOPATH/src/my/package/config,请使用以下命令:

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

答案 1 :(得分:1)

这是一个简单的示例,希望它可以阐明并帮助您轻松实现:

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

$ 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中编写的特定应用程序提供了哪些功能,您可以使用nm随附的go tool进行列出全部ldflags

只需构建应用,然后使用go tool nm列出所有链接器标志。

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

还有什么问题或需要进一步澄清的吗?请随时在下面发表评论,我们会尽快与您联系。