Golang - Как отобразить версию модулей изнутри кода

Я пишу два двоичных файла, и оба они используют две библиотеки (мы можем называть их libA и libB).

Каждая библиотека находится в специальном репозитории git с тегами git для объявления версий. Например, libA - v1.0.9, а libB - v0.0.12.

Оба двоичных файла имеют флаги CLI, и я хотел бы добавить флаг отладки для отображения таких версий библиотеки:

> ./prog -d
Used libraries:
- libA, v1.0.9
- libB, v0.0.12

Я не знаю, как это сделать.

Единственный способ установить переменную "извне" - это использовать ldflags (например, go build -ldflags="-X 'main.Version=v1.0.0'"). Но этот способ не кажется масштабируемым, как добавить libC? Это также подразумевает управление тегами два раза, один раз для git и один раз в goreleaser.yml или makefile.

Вы можете помочь мне найти решение?


person Sébastien    schedule 25.05.2020    source источник


Ответы (1)


Инструмент Go включает информацию о модулях и зависимостях в исполняемый двоичный файл. Вы можете использовать runtime/debug.ReadBuildInfo() для его приобретения. Он возвращает вам список зависимостей, включая путь к модулю и версию. Каждый модуль / зависимость описывается значением типа debug.Module, которое содержит следующую информацию:

type Module struct {
    Path    string  // module path
    Version string  // module version
    Sum     string  // checksum
    Replace *Module // replaced by this module
}

Например:

package main

import (
    "fmt"
    "log"
    "runtime/debug"

    "github.com/icza/bitio"
)

func main() {
    _ = bitio.NewReader
    bi, ok := debug.ReadBuildInfo()
    if !ok {
        log.Printf("Failed to read build info")
        return
    }

    for _, dep := range bi.Deps {
        fmt.Printf("Dep: %+v\n", dep)
    }
}

Это выводит (попробуйте на Go Playground):

Dep: &{Path:github.com/icza/bitio Version:v1.0.0 Sum:h1:squ/m1SHyFeCA6+6Gyol1AxV9nmPPlJFT8c2vKdj3U8= Replace:<nil>}

Также см. Соответствующий вопрос: Как получить подробные журналы сборки Go со всеми используемыми пакетами в режиме GOPATH и модуля go?

person icza    schedule 25.05.2020
comment
Насколько я понимаю, это подразумевает сборку двоичного файла с отладочной информацией, я точно не знаю, что это значит. Есть ли эффект безопасности / конфиденциальности? - person Sébastien; 07.06.2020
comment
@ Sébastien Для этого требуется только сборка с поддержкой модулей, ничего больше. - person icza; 07.06.2020