关于go:如何在Golang构建中使用-ldflags -X设置软件包变量


How to set package variable using -ldflags -X in Golang build

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

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

这是我的构建命令:

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


引用Command的文档链接:

1
2
3
4
-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软件包。但是,您必须指定完整的导入路径,而不仅仅是软件包名称。

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

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

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

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

1
$ mkdir app && cd app

创建子目录config

1
$ mkdir config

添加以下文件。它应该在app/config/vars.go

1
2
3
4
5
6
package config

var Version string

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

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

1
2
3
4
5
6
7
8
9
10
11
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)'"

构建完成后,您现在可以运行该应用程序:

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

最后,有时您可能需要探索自己未在ldflags中编写的特定应用程序提供了什么功能,可以使用go tool随附的nm列出所有ldflags来实现此目的。铅>

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

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

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