Golang - Как вывести версию модулей изнутри кода - PullRequest
1 голос
/ 25 мая 2020

Я пишу два двоичных файла, и оба они используют две библиотеки (мы можем называть их 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'"). Но этот способ не кажется масштабируемым, как добавить lib C? Это также подразумевает управление тегами два раза, один раз для git и один раз в goreleaser.yml или make-файле.

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

1 Ответ

0 голосов
/ 25 мая 2020

Инструмент 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 модуль "режим"?

...