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

moz*_*zey 13 go

如果我编译这个程序

package main

import (
    "fmt"
    "os"
)

var version = os.Getenv("VERSION")

func main() {
    fmt.Println(version)
}
Run Code Online (Sandbox Code Playgroud)

它在我运行时打印env var

VERSION="0.123" ./example
> 0.123
Run Code Online (Sandbox Code Playgroud)

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

VERSION="0.123" go build example.go
Run Code Online (Sandbox Code Playgroud)

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

./example
Run Code Online (Sandbox Code Playgroud)

Ain*_*r-G 21

转1.5及以上编辑:

截至目前,语法已经改变.使用

go build -ldflags "-X main.Version=$VERSION"
Run Code Online (Sandbox Code Playgroud)

在Linux上,在Windows上使用

go build -ldflags "-X main.Version=%VERSION%"
Run Code Online (Sandbox Code Playgroud)

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

go build -ldflags "-X main.Version $VERSION"
Run Code Online (Sandbox Code Playgroud)

编辑:在Windows上这将是

go build -ldflags "-X main.Version %VERSION%"
Run Code Online (Sandbox Code Playgroud)

链接器文档中的更多信息.

  • +1非常酷,我不知道这个.一个注意事项:在Windows上你必须写`go build -ldflags"-X main.Version%VERSION%"` (2认同)

Cod*_*Ray 6

Ainer-G's answer led me to the right place, but it wasn't a full code sample answering the question. A couple of changes were required:

  1. Declare the version as var version string
  2. Compile with -X main.version=$VERSION

Here's the full code:

package main

import (
    "fmt"
)

var version string

func main() {
    fmt.Println(version)
}
Run Code Online (Sandbox Code Playgroud)

Now compile with

go build -ldflags "-X main.version=$VERSION"
Run Code Online (Sandbox Code Playgroud)


icz*_*cza 5

有一个os.Setenv()函数可以用来设置环境变量。

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

func init() {
    os.Setenv("VERSION", "0.123")
}
Run Code Online (Sandbox Code Playgroud)

如果您不想“手动”执行此操作,您可以为此创建一个工具,该工具将读取环境VERSION变量的当前值并在包中生成一个.go源文件,其中包含与上面的代码完全相同的内容(除了使用当前的值)环境变量的值VERSION)。您可以通过发出命令来运行此类代码生成go generate

请阅读生成代码博客文章,了解有关go generate.