Golang将环境​​变量编译成二进制

时间:2015-02-11 16:15:08

标签: go

如果我编译这个程序

package main

import (
    "fmt"
    "os"
)

var version = os.Getenv("VERSION")

func main() {
    fmt.Println(version)
}

当我运行它时打印env var

VERSION="0.123" ./example
> 0.123

有没有办法将env var编译成二进制文件,例如:

VERSION="0.123" go build example.go

然后在我运行时获得相同的输出

./example

4 个答案:

答案 0 :(得分:18)

转1.5及以上编辑:

截至目前,语法已发生变化。使用

go build -ldflags "-X main.Version=$VERSION"

在Linux上,在Windows上使用

go build -ldflags "-X main.Version=%VERSION%"

这是-X链接器标志的用途。在你的情况下,你会做

go build -ldflags "-X main.Version $VERSION"
在Windows上

编辑这将是

go build -ldflags "-X main.Version %VERSION%"

More info in the linker docs

答案 1 :(得分:4)

Ainer-G的回答把我带到了正确的地方,但这并不是回答这个问题的完整代码示例。需要进行一些更改:

  1. 将版本声明为var version string
  2. 使用-X main.version=$VERSION
  3. 进行编译

    这是完整的代码:

    package main
    
    import (
        "fmt"
    )
    
    var version string
    
    func main() {
        fmt.Println(version)
    }
    

    现在使用

    进行编译
    go build -ldflags "-X main.version=$VERSION"
    

答案 2 :(得分:3)

您可以使用os.Setenv()函数设置环境变量。

因此,您可以通过设置环境变量来启动应用程序:

func init() {
    os.Setenv("VERSION", "0.123")
}

如果您不希望通过" hand"执行此操作,则可以为此创建一个工具,该工具将读取VERSION环境变量的当前值并生成{包中的{1}}源文件与上面的代码完全相同(除了使用.go环境变量的当前值)。您可以通过发出VERSION命令来运行此类代码。

阅读Generating code博文,了解有关go generate

的更多详情

答案 3 :(得分:-1)

最简单的解决方案,只需链接命令:

代替:

VERSION="0.123" go build example.go

要做:

go build example.go && VERSION="0.123" ./example