如果我编译这个程序
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
答案 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%"
答案 1 :(得分:4)
Ainer-G的回答把我带到了正确的地方,但这并不是回答这个问题的完整代码示例。需要进行一些更改:
var version string
-X main.version=$VERSION
这是完整的代码:
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