Одна из вещей, которая мне нравится в Go, - это модель доставки с одним исполняемым файлом. Для небольших проектов это так же просто, как перетащить встроенный исполняемый файл туда, где он мне нужен. Однако через некоторое время я могу легко забыть, на какой версии моей кодовой базы был построен данный исполняемый файл. Если мне нужно отменить изменение, как я могу убедиться, что строю из правильного коммита?

В крупных проектах именно здесь на помощь приходит CI / CD. Однако для небольших прототипов настройка CI может быть ненужным излишеством до гораздо более поздней стадии процесса.

К счастью, есть простой способ «запечь» информацию о текущем хэше фиксации прямо во встроенном исполняемом файле.

Go не имеет специальной системы сборки, но стандартной практикой в ​​сообществе является использование make. Make широко доступен в операционных системах * nix (включая macOS), поэтому я обычно добавляю простой Makefile в большинство своих проектов Go. В этом случае мой make-файл будет выглядеть так:

GOOS=linux
GOARCH=386

.PHONY: build

GIT_COMMIT := $(shell git rev-list -1 HEAD)

build:
	GOOS=$(GOOS) GOARCH=$(GOARCH) go build -ldflags "-X main.gitCommit=$(GIT_COMMIT)" .

Здесь следует отметить две вещи:

  1. GIT_COMMIT будет хранить значение текущего хэша фиксации, на котором находится наша база кода.
  2. -ldflags "-X main.gitCommit=$(GIT_COMMIT)" - это способ Go указать компоновщику передать хэш фиксации переменной в коде (main.gitCommit). Думайте об этом как о «запекании» информации прямо в скомпилированный исполняемый файл.

Все, что нам нужно для этого, - использовать make build вместо go build ....

В нашем коде мы можем проверить наличие флага (например, -v) и отобразить хэш:

package main

var gitCommit string

func printVersion() {
	log.Printf("Current build version: %s", gitCommit)
}

func main() {
	versionFlag := flag.Bool("v", false, "Print the current version and exit")
	flag.Parse()

	switch {
	case *versionFlag:
		printVersion()
		return
	}
	// continue with other stuff
}

Связанное чтение:







Первоначально опубликовано на https://preslav.me 9 июля 2019 г.

Купи мне кофе ☕️