config

package module
v0.5.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 11, 2025 License: Apache-2.0 Imports: 9 Imported by: 7

README

go-kit/config

Go Reference GitHub Release GoCard GitHub license

Пакет для работы с конфигурацией приложения, основанный на go-flags.

Использование

package main

import (
	"os"

	"github.com/LeKovr/go-kit/config"
)

// Config holds all config vars.
type Config struct {
	config.EnableShowVersion
	config.EnableConfigDefGen
	config.EnableConfigDump

	// ... other config options ...
}

const (
	// Application name
	application = "myapp"
)

var (
	// App version, actual value will be set at build time.
	version = "0.0-dev"

	// Repository address, actual value will be set at build time.
	repo = "repo.git"
)

func main() {

	config.SetApplicationVersion(application, version)
	var cfg Config
	err := config.Open(&cfg)

	defer func() {
		config.Close(err, os.Exit)
	}()

	if err != nil {
		return
	}

	// Do other application work ..
}

См. Также: example/main.go

Функционал

В дополнение к возможностям go-flags, добавлен функционал, который активируется при добавлении (embedding) соответствующей структуры в структуру Config, а выполняется в составе config.Open.

Доступный в конкретном приложении функционал можно увидеть, вызвав его с ключом -h, пример:

$ ./example -h
Usage:
  example [OPTIONS]

Application Options:
      --version                  Show version and exit
      --config_gen=[|json|md|mk] Generate and print config definition in given format and exit (default: '', means skip) [$CONFIG_GEN]
      --config_dump=             Dump config dest filename [$CONFIG_DUMP]

Help Options:
  -h, --help                     Show this help message

EnableShowVersion

При вызове с ключом --version, происходит печать версии приложения и завершение работы

EnableConfigDump

При вызове с ключом --config_dump=config.json, в файл config.json сохраняются все настройки приложения и работа продолжается

EnableConfigDefGen

При вызове с ключом --config_gen=X, происходит печать описания параметров конфигурации в формате X и завершение работы.

Поддерживаемые форматы описания

  • md - Markdown, для документирования
  • mk - Makefile, для генерации первичных значений .env
  • json - JSON, для внешних систем поддержки конфигураций

Почему github.com/jessevdk/go-flags ?

Как преимущества, были оценены возможности

  1. инкапсулировать все настройки пакета в некую структуру, у которой есть значения по умолчанию и их изменения пользователь может передать пакету минуя основное приложение (в т.ч. при изменении их списка код приложения менять не надо, достаточно перекомпилировать)
  2. иметь удобный способ любую константу, которая в процессе эксплуатации может измениться, вынести в конфиг
Минусы

Задача выбора из заданного списка вариантов решена Jesse van den Kieboom как перечисление нескольких choice в теге поля. Это расходится с reflect.StructTag.Get, который не может вернуть массив, и порождает оценки вроде bad library design.

Замечание линтера duplicate struct tag "choice" (SA5008) отключается директивой //lint:ignore SA5008 accepted as correct.

См также

Documentation

Overview

Example (VersionRequested)
cfg := EnableShowVersion{GoKitConfigShowVersionOption: true}
SetApplicationVersion("app", "version")
err := cfg.GoKitConfigShowVersionRequested()
fmt.Println(err)
Output:

app version
version printed

Index

Examples

Constants

View Source
const (
	// ExitNormal means there is no errors
	ExitNormal = iota
	// ExitError returned on application error
	ExitError
	// ExitBadArgs returned on config parse error
	ExitBadArgs
	// ExitHelp returned when help was requested
	ExitHelp
)

Variables

View Source
var (
	// ErrHelpRequest returned when help requested
	ErrHelpRequest = errors.New("help requested")
	// ErrPrinted returned after showing error message
	ErrPrinted = errors.New("error printed")
	// ErrVersion returned after showing app version
	ErrVersion = errors.New("version printed")
	// ErrConfGen returned after config generation
	ErrConfGen = errors.New("config printed")
)
View Source
var (
	// LineFormatMk - формат строк параметра для Makefile.
	LineFormatMk = "#- %s (%s) [%s]\n%-20s ?=%s\n"
	// HeaderFormatMk - формат строки названия группы параметров для Makefile.
	HeaderFormatMk = "\n# %s\n\n"

	// LineFormatMD - формат строки параметра для Markdown.
	LineFormatMD = "| %-20s | %-20s | %s | %s | %s |\n"
	// HeaderFormatMD - формат строки названия группы параметров для Markdown.
	HeaderFormatMD = "\n### %s%s\n\n"
	// TableHeaderMD - шапка таблицы группы параметров для Markdown.
	TableHeaderMD = `| Name | ENV | Type | Default | Description |` + "\n|------|-----|------|---------|-------------|"
)

Functions

func Close

func Close(e error, exitFunc func(code int))

Close runs exit after deferred cleanups have run

func Open

func Open(cfg any, args ...string) (err error)

Open loads flags from args (if given) or command flags and ENV otherwise

func PrintConfig added in v0.4.0

func PrintConfig(obj any, format string)

PrintConfig fetches config tags from obj struct and prints them in given format.

func PrintConfigM added in v0.4.0

func PrintConfigM(defs []Def, onlyEnv bool, namePrefix, envPrefix, title string)

PrintConfigM выводит конфиг в формате Makefile (onlyEnv) или MarkDown.

func ProcessOptions added in v0.5.0

func ProcessOptions(cfg any) error

func SaveJSON added in v0.5.0

func SaveJSON(fileName string, data any) error

SaveJSON сохраняет данные в файл в формате JSON.

func SetApplicationVersion added in v0.5.0

func SetApplicationVersion(app, ver string)

Types

type Def added in v0.5.0

type Def struct {
	Name        string    `json:"name"`
	Env         string    `json:"env,omitempty"`
	Description string    `json:"description,omitempty"`
	IsGroup     bool      `json:"is_group,omitempty"`
	Group       *GroupDef `json:"group,omitempty"`
	Item        *ItemDef  `json:"item,omitempty"`
}

Def - атрибуты группы/параметра конфигурации.

func FetchDefs added in v0.5.0

func FetchDefs(obj any) []Def

FetchDefs fetch config definitions from Config struct.

type EnableConfigDefGen added in v0.5.0

type EnableConfigDefGen struct {
	GoKitConfigDefGenOption string `` /* 184-byte string literal not displayed */
}

EnableConfigDefGen содержит настройки для поддержки `config_gen`.

func (EnableConfigDefGen) GoKitConfigDefGenRequested added in v0.5.0

func (opt EnableConfigDefGen) GoKitConfigDefGenRequested(cfg any) error

type EnableConfigDump added in v0.5.0

type EnableConfigDump struct {
	// GoKitConfigRequestForConfGen
	GoKitConfigDumpOption string `description:"Dump config dest filename" long:"config_dump" env:"CONFIG_DUMP"`
}

Generate содержит настройки для поддержки `config_gen`.

func (EnableConfigDump) GoKitConfigDumpRequested added in v0.5.0

func (opt EnableConfigDump) GoKitConfigDumpRequested(cfg any) error

type EnableShowVersion added in v0.5.0

type EnableShowVersion struct {
	// GoKitConfigShowVersionOption - флаг для вывода версии приложения.
	GoKitConfigShowVersionOption bool `description:"Show version and exit" long:"version"`
}

EnableShowVersion при включении в Config добавляет поддержку `--version`.

func (EnableShowVersion) GoKitConfigShowVersionRequested added in v0.5.0

func (opt EnableShowVersion) GoKitConfigShowVersionRequested() error

type ErrBadArgsContainer added in v0.2.0

type ErrBadArgsContainer struct {
	// contains filtered or unexported fields
}

ErrBadArgsContainer holds config parse error

func (ErrBadArgsContainer) Error added in v0.2.0

func (e ErrBadArgsContainer) Error() string

Error returns inner Error()

type GroupDef added in v0.5.0

type GroupDef struct {
	Items []Def `json:"items"`
}

GroupDef - атрибуты группы параметров.

type IsDefGenRequested added in v0.5.0

type IsDefGenRequested interface {
	GoKitConfigDefGenRequested(cfg any) error
}

type IsDumpRequested added in v0.5.0

type IsDumpRequested interface {
	GoKitConfigDumpRequested(cfg any) error
}

type IsShowVersionRequested added in v0.5.0

type IsShowVersionRequested interface {
	GoKitConfigShowVersionRequested() error
}

IsShowVersionRequested доступен, если в структуру встроен `EnableShowVersion`.

type ItemDef added in v0.5.0

type ItemDef struct {
	Type    string   `json:"type"`
	Default string   `json:"default,omitempty"`
	Options []string `json:"options,omitempty"`
}

ItemDef - атрибуты параметра конфигурации.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL