教你用go 配置管理神器Viper解析docker-compose文件

2023-10-27

什么是Viper?

Viper 是一个完整的 Go 应用程序配置解决方案,包括 12-Factor 应用程序。 它被设计为在应用程序中工作,并且可以处理所有类型的配置需求和格式。

它支持:

设置默认值 从 JSON、TOML、YAML、HCL、envfile 和 Java 属性配置文件读取

实时监视和重新读取配置文件(可选)

从环境变量读取 从远程配置系统(etcd 或 Consul)

读取并监视 更改从命令行读取标志从缓冲区读取设置显式值

Viper 可以满足所有应用程序配置需求。

为什么是Viper?

在构建应用程序时,你不会想要花费过多时间在配置文件上的

想专注于构建出色的软件?Viper 可以为您提供帮助。

Viper 会为您执行以下操作:

1/查找、加载和解构 JSON、TOML、YAML、HCL、INI、envfile 或 Java 属性格式的配置文件。

2.为不同的应用程序提供不同的默认配置。

3.提供一种机制覆盖通过命令行标志指定的选项。

4.提供别名系统,可以轻松重命名参数,而不会破坏现有代码。

5.可以轻松区分用户提供的命令行选项或配置文件与默认值相同的情况。

Viper 使用以下优先顺序。 每个项目优先于其下面的项目:

  • explicit call to Set
  • flag
  • env
  • config
  • key/value store
  • default

重要提示:Viper 配置键不区分大小写。 关于将其设为可选的讨论正在进行中。

让我们来让Viper读取数值 

从配置文件中读取数据

Viper 需要最少的配置,因此它知道在哪里查找配置文件。 Viper 支持 JSON、TOML、YAML、HCL、INI、envfile 和 Java Properties 文件。 Viper 可以搜索多个路径,但目前单个 Viper 实例仅支持单个配置文件。 Viper 不默认使用任何配置搜索路径,将默认决定留给应用程序。

下面是如何使用 Viper 搜索和读取配置文件的示例。 不需要指定任何特定路径,但至少应在需要配置文件的位置提供一个路径。

viper.SetConfigName("config") // config文件的名字 (不带扩展名需设置config文件的扩展类型)
viper.SetConfigType("yaml") // 上一条未设置扩展名(像是.json)在这里设置
viper.AddConfigPath("/etc/appname/")   // config文件所在的文件夹路径
viper.AddConfigPath("$HOME/.appname")  // 多次使用AddConfigPath可以加上多个搜索路径
viper.AddConfigPath(".")               // (可选)在当前目录中查找配置
err := viper.ReadInConfig() // 查找并读取配置文件
if err != nil { // 处理在读取配置文件中遇到的问题
	panic(fmt.Errorf("fatal error config file: %w", err))
}

您可以为处理找不到配置文件的特定情况进行处理,如下所示:

if err := viper.ReadInConfig(); err != nil {
	if _, ok := err.(viper.ConfigFileNotFoundError); ok {
		// 忽视未找到配置文件的错误
	} else {
		// 找到配置文件,但产生另一个错误
	}
}

// 成功找到配置文件并未错误

注意 [自 1.6 起]:您还可以拥有不带扩展名的文件并以编程方式指定格式。 对于那些位于指定目录中且没有任何扩展名(如 .bashrc)的文件

 写入配置文件

从配置文件中读取很有用,但有时您希望存储在运行时所做的所有修改。 为此,可以使用一堆命令,每个命令都有自己的用途:

WriteConfig - 将当前 viper 配置写入预定义路径(如果存在)。 如果没有预定义路径,则会出错。 将覆盖当前配置文件(如果存在)。
SafeWriteConfig - 将当前 viper 配置写入预定义路径。 如果没有预定义路径,则会出错。 不会覆盖当前配置文件(如果存在)。
WriteConfigAs - 将当前的 viper 配置写入给定的文件路径。 将覆盖给定文件(如果存在)。
SafeWriteConfigAs - 将当前的 viper 配置写入给定的文件路径。 不会覆盖给定文件(如果存在)。
根据经验,标有安全的所有内容都不会覆盖任何文件,而只是在不存在时创建,而默认行为是创建或截断。

一个小示例部分:

viper.WriteConfig() // writes current config to predefined path set by 'viper.AddConfigPath()' and 'viper.SetConfigName'
viper.SafeWriteConfig()
viper.WriteConfigAs("/path/to/my/.config")
viper.SafeWriteConfigAs("/path/to/my/.config") // will error since it has already been written
viper.SafeWriteConfigAs("/path/to/my/.other_config")

2.读取配置

在 Viper 中,根据值的类型,有几种获取值的方法。 存在以下函数和方法:

  • Get(key string) : interface{}
  • GetBool(key string) : bool
  • GetFloat64(key string) : float64
  • GetInt(key string) : int
  • GetIntSlice(key string) : []int
  • GetString(key string) : string
  • GetStringMap(key string) : map[string]interface{}
  • GetStringMapString(key string) : map[string]string
  • GetStringSlice(key string) : []string
  • GetTime(key string) : time.Time
  • GetDuration(key string) : time.Duration
  • IsSet(key string) : bool
  • AllSettings() : map[string]interface{}

EX:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

教你用go 配置管理神器Viper解析docker-compose文件 的相关文章

随机推荐

  • 蓝桥杯C++组怒刷50道真题(填空题)

    深夜伤感网抑云 南辰Music 御小兮 单曲 网易云音乐 多年后再见你 乔洋 周林枫 单曲 网易云音乐 填空题25题完结 等23年题目出来了会补充 下一步就是编程题了 24年蓝桥杯之前 一定会给大家精心准备几个博客 目录 填空题 一 蓝桥杯
  • OSPF和RIP

    OSPF协议 劢态路由协议 通过在路由器上运行劢态路由协议 在路由器乊间交互路由信息 学习路由信 息最织生成路由转収表项 常见的劢态路由协议 RIP OSPF ISIS EIGRP BGP 劢态路由协议适用场合 路由器数量较夗 网段数量较夗
  • 找出一个无序数组的中位数

    要解决这个问题首先要了解什仫是中位数 所谓的中位数就是在一组有序的数字中找到中间的那个数字 如果数字的个数是奇数则直接返回中间的那个数 如果数字的个数是偶数此时这组数据的中位数有两个 取中间两个数的平均值即可 想法一 不论用什仫排序算法使得
  • flutter android 和 ios 发布

    android篇 keytool genkey v alias android keyalg RSA validity 20000 keystore Users 当前用户的用户名 android keystore keytool genke
  • Web学习之JavaScript

    文章目录 一 什么是JavaScript 二 JavaScript 用法 三 Chrome 浏览器中执行 JavaScript 四 JavaScript 语法 五 JavaScript 语句 六 JavaScript 函数 七 JavaSc
  • 【redis】单机安装部署redis7.0版本

    下面我以redis 7 0 5版本 来进行讲解 链接 https pan baidu com s 1FesU8iHJQyW4pVARIqeQAA 提取码 qtqc 单机安装Redis 1 首先需要安装Redis所需要的依赖 yum inst
  • 预测知识

    预测知识 预测技术流程及模型评价 目录 预测知识 预测技术流程及模型评价 神经网络 机器学习 深度学习 参考资料 神经网络 神经网络 neural network 是机器学习的一个重要分支 也是深度学习的核心算法 神经网络的名字和结构 源自
  • 上传图片几种方式解析(上)--file

    浏览器上传图片到服务器时通过input type file 以及onchange事件的配合实现的 element和vant的ui库的图片上传都是基于这个 input的files属性 1 众所周知 一级dom事件不同于addeventlisn
  • c语言三目运算符的一些小细节,赋值不改变变量的值

    C语言三目运算符的一些小细节 赋值不改变变量的值 今天无聊翻翻C语言的课本 看到三目运算符的时候 心想这个和if else 语句用法一样 突然脑海里浮现一个想法 三目运算符结构 表达式1 表达式2 表达式3 表达式1 为逻辑表达式 如果为真
  • 使用左、右、全、内连接及使用where条件语句的区别

    使用左 右 全 内连接及使用 where 条件语句的区别 从学SQL语句到现在 从来没有使用过左右连接 也许会有人感到惊讶 但是确实是没有 因为我一直是使用的WHERE条件语句 我也想试一下效果 今天做了一下测试 终于知道 WHERE 条件
  • MySQL --- 多表查询

    多表查询 事务 以及提升查询效率最有手段的索引 一 多表查询 1 1 多表查询 概述 1 1 1 数据准备 将资料中准备好的多表查询数据准备的SQL脚本导入数据库中 部门表 员工表 1 1 2 介绍 多表查询 指从多张表中查询数据 就是从多
  • 系统架构设计师(第二版)学习笔记----信息安全基础知识

    原文链接 系统架构设计师 第二版 学习笔记 信息系统基础 文章目录 一 信息安全的概念 1 1 信息安全的基本要素 1 2 信息安全的内容 1 3 设备安全的内容 1 4 数据安全的内容 1 5 内容安全的含义 1 6 行为安全的含义 二
  • Python函数常见return返回值类型

    Python函数常见return返回值类型Python函数return返回值类型主要包括 class int class str class tuple class list class dict class bool class None
  • 小明和小强的故事 漫画版

    转载于 https blog 51cto com loofeer 676484
  • 发送arp请求报文

    1 报文格式 2 代码如下 include
  • Python爬虫入门教程(非常详细)

    初学Python之爬虫的简单入门 一 什么是爬虫 1 简单介绍爬虫 爬虫的全称为网络爬虫 简称爬虫 别名有网络机器人 网络蜘蛛等等 网络爬虫是一种自动获取网页内容的程序 为搜索引擎提供了重要的数据支撑 搜索引擎通过网络爬虫技术 将互联网中丰
  • C# 计算两个日期之间的所有日期

    用一个for循环就可以解决 int year Begin Convert ToInt32 this dateBegin Value ToString yyyy int month Begin Convert ToInt32 this dat
  • 解决英文版windows10安装软件中文显示乱码问题

    实验室买了台Thorlabs的设备 配了一台笔记本 带的操作系统是美版的windows10 为了提高笔记本的利用率嘛就在这台笔记本安装了一些中文软件 结果问题就出现了 安装完某些中文软件 能正常打开也能正常操作就是显示的中文乱码 在网上找了
  • [SPSS]系统聚类和kmeans聚类的spss实现——基于多维度对中国各城市聚类

    一 系统聚类 选中系统聚类并把变量移入变量框内 聚类选择按照个案聚类 在Display栏中选择Statistics和Plots复选框 这样在结果输出窗口中可以同时得到聚类结果统计量和统计图 选中绘图中的谱系图 单击保存选项卡 方案范围选择2
  • 教你用go 配置管理神器Viper解析docker-compose文件

    什么是Viper Viper 是一个完整的 Go 应用程序配置解决方案 包括 12 Factor 应用程序 它被设计为在应用程序中工作 并且可以处理所有类型的配置需求和格式 它支持 设置默认值 从 JSON TOML YAML HCL en