【发布时间】:2015-04-23 09:48:03
【问题描述】:
在构建 Go 程序以进行发布时,仅使用 go build 而不使用任何其他选项是标准做法吗?我问是因为在使用go build 构建时,默认情况下会包含所有调试信息。要删除它,您可以将选项传递给链接器,因此:
go build -ldflags "-w" prog.go
这将省略所有调试符号。在构建发布程序时,您会删除这些信息还是保持原样?
编辑:为了清楚起见,我想知道人们如何编译 Go 程序以部署到实时环境。在其他编译语言中,您有一组不同的编译器命令行选项用于调试和发布版本,而发布版本通常会优化可执行文件并删除调试信息。
【问题讨论】:
-
从 Go 程序中删除调试信息可能会破坏反射的某些用途。你不应该使用那个标志。
-
取决于您的用例。对于部署到我自己的服务器,我猜这是绝大多数 Go 用户的部署方式——你真的不应该这样做。它实际上没有给你任何东西,并且会阻止服务器上的调试和一些反射的东西。
-
@FUZxxl 反射有什么用?一切似乎都很好。 reddit.com/r/golang/comments/2woogl/…
-
普通的
go build是常态。当你go get某事时它会运行;直到今天我才知道-ldflags -w; Go 通常的规范是不要为了一点点调整而使事情复杂化。我怀疑它会产生巨大的影响(静态链接是大型二进制文件的主要原因);并且对剥离符号的反应似乎普遍消极on this golang-nuts thread。 -
Going by this old thread 我认为
-s必须为运行时保留一些数据(因此剥离甚至不能完全剥离)。此外,Reddit 上的用户 davecheney 表示仅使用“go build”是标准做法,并且是 Go 项目的提交者之一,所以相信他。 :)
标签: go compilation release