Различное поведение компоновки в зависимости от того, как запускается бинарный файл - PullRequest
0 голосов
/ 04 марта 2020

Я хочу добавить команду cobra в мой go cli инструмент, который просто печатает версию

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 поведение меняется, я не могу переопределить 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 version
go version go1.14 darwin/amd64

1 Ответ

0 голосов
/ 04 марта 2020

Ваш go build создает двоичный файл и сохраняет его. Ваш go install создает новый двоичный файл и сохраняет его в GOPATH/bin. go install не использует двоичный файл, созданный ранее go build. Если вы хотите указать значения версии в вашем go build, вам следует распространять полученный двоичный файл, а не поощрять пользователей использовать go install.

В качестве альтернативы, вы можете указать ldflags в вашей команде go install, но это, вероятно, довольно обременительно для конечных пользователей - они не будут заботиться о том, чтобы выводить правильную строку версии, чтобы беспокоиться о гораздо более длинной команде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...