【问题标题】:In a Golang application, how to embed a version in a other package than main?在 Golang 应用程序中,如何将版本嵌入到除 main 之外的其他包中?
【发布时间】:2016-05-21 13:50:00
【问题描述】:

this SO question 的启发,我想使用相同的机制在我的 golang 应用程序中嵌入版本号。但是我正在使用Cobra 命令行解析器并希望有一个version 子命令。这导致以下目录和包结构:

.
|-- cmd                                                                   
`-- version.go                                                    
|-- main.go                                                           

到目前为止,我已经尝试了以下方法:

go run -ldflags "-X cmd/version.versionString=0.1.0" main.go version

-

go run -ldflags "-X version.versionString=0.1.0" main.go version

-

go run -ldflags "-X version.VersionString=0.1.0" main.go version

version.go 包含如下变量声明:

var versionString string

var VersionString string

分别。

我也尝试将变量声明放在 main.go 中,但我不清楚如何为我尝试的这个选项引用 version.go 中的变量:

import "github.com/basbossink/psiw"
....
fmt.Println(psiw.VersionString)

-

import "github.com/basbossink/psiw/main"
...
fmt.Println(main.VersionString)

在这两种情况下,编译器都会抱怨 psiwmain 分别是未知的。 请注意,在 main 中使用 VersionString 会得到预期的结果。

我更喜欢链接标志指向version 包中的变量的解决方案,因为它们不需要后向指针。但欢迎提出任何建议。

【问题讨论】:

    标签: go version auto-versioning


    【解决方案1】:

    查看Hugo source,我找到了我的问题的答案。诀窍是使用:

    go run -ldflags "-X github.com/basbossink/psiw/cmd.versionString=0.1.0" main.go version
    

    所以我犯了两个错误:

    • 我混淆了包和源文件的概念,version.go 文件有package cmd 作为它的包声明。
    • 引用变量的方法是使用完全限定名。

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 2017-06-03
      • 2014-04-11
      相关资源
      最近更新 更多