猿问

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

我想向cobra我的gocli 工具添加一个仅打印版本的命令


var version = "development"


// versionCmd prints mytool version

var versionCmd = &cobra.Command{

    Use:   "version",

    Short: "Print mytool version information",

    RunE: func(cmd *cobra.Command, args []string) error {


        fmt.Println("mytool version", version)

        return nil

    },

}


我可以覆盖(或选择不这样做)version变量使用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行为更改时,我似乎无法覆盖versionvar,这是为什么呢?



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


▶ go install                                                                                  


▶ ~/go/bin/mytool version                                                                      

mytool version development

使用


▶ go version

go version go1.14 darwin/amd64


慕侠2389804
浏览 90回答 1
1回答

UYOU

您go build创建一个二进制文件并保存它。您go install 创建了一个新的二进制文件并将其保存到 GOPATH/bin. go install不使用之前由go build. 如果您想在您的 中指定版本值go build,您应该分发生成的二进制文件,而不是鼓励用户使用go install.或者,您可以ldflags在go install命令中指定,但这对于最终用户来说可能非常麻烦 - 他们不会足够关心让它输出正确的版本字符串来打扰更长的命令。
随时随地看视频慕课网APP

相关分类

Go
我要回答