不同的链接行为取决于go二进制文件的运行方式

不同的链接行为取决于go二进制文件的运行方式,go,Go,我想将一个cobra命令添加到我的gocli工具中,该工具只打印版本 var version=“开发” //versionCmd打印我的工具版本 var versionCmd=&cobra.Command{ 使用:“版本”, 简短:“打印我的工具版本信息”, 符文:func(cmd*cobra.Command,args[]字符串)错误{ fmt.Println(“我的工具版本”,版本) 归零 }, } 我可以使用ldflags ▶ go build ▶ ./mytool version my

我想将一个
cobra
命令添加到我的
go
cli工具中,该工具只打印版本

var version=“开发”
//versionCmd打印我的工具版本
var versionCmd=&cobra.Command{
使用:“版本”,
简短:“打印我的工具版本信息”,
符文:func(cmd*cobra.Command,args[]字符串)错误{
fmt.Println(“我的工具版本”,版本)
归零
},
}
我可以使用
ldflags

▶ go build

▶ ./mytool version
mytool version development

▶ go build -ldflags "-X github.com/myprofile/mytool/cmd.version=$(git describe --tags --always)"

▶ ./mytool version                                                                             
mytool version cffc487
但是,当执行
go install
时,行为会发生变化,我似乎无法覆盖
version
var,这是为什么


▶ go build -ldflags "-X github.com/myprofile/mytool/cmd.version=$(git describe --tags --always)"

▶ go install                                                                                  

▶ ~/go/bin/mytool version                                                                      
mytool version development
使用


您的
go build
创建一个二进制文件并保存它。您的
go-install
创建一个新的二进制文件并将其保存到
GOPATH/bin
go-install
不使用以前由
go-build
创建的二进制文件。如果要在
go-build
中指定版本值,则应分发生成的二进制文件,而不是鼓励用户使用
go-install


或者,您可以在
go install
命令中指定
ldflags
,但对于最终用户来说,这可能相当麻烦-他们不会太在意让它输出正确的版本字符串来处理更长的命令。

您在
go install
期间没有设置
-ldflags
,因此它没有设置。
▶ go version
go version go1.14 darwin/amd64