Одна из вещей, которая мне нравится в 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)" .
Здесь следует отметить две вещи:
GIT_COMMIT
будет хранить значение текущего хэша фиксации, на котором находится наша база кода.-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 г.