Skip to content

配置

系统配置

在网站后台:常规管理 > 系统配置 可以进行配置的项目,我们称之为系统配置。

  • 系统配置是保存在数据库中的。
  • 系统配置可以在后台可视化的进行修改。
  • 可以随时在后台添加新的系统配置。
  • 管理员添加的配置项,也可以直接在后台删除。

获取系统配置

我们在 config 仓储封装了 GetConfigsGetConfigsByGroup 方法,用于同时获取多个配置,或直接获取某个分组的全部配置;

go
configNames := []string{"name", "record_number", "version"}
result, err := h.configRepo.GetConfigs(c.Request.Context(), configNames)
if err != nil {
    httpx.Fail(c, httpx.WithMessage("获取配置失败: "+err.Error()))
    return
}
go
// 获取所有 group=basic 的配置项(基础配置分组的配置),
// 返回值类型是 map[string]string,格式是 name=value
cfg, err := h.configRepo.GetConfigsByGroup(c.Request.Context(), "basic")
if err != nil {
    httpx.Fail(c, httpx.WithMessage("获取基础配置失败: "+err.Error()))
    return
}

文件配置

我们在 项目根目录/config/ 下放置了多个 yaml 格式的配置文件:

  • config.yaml 未分类的综合配置,含: 应用、服务、数据库、token、cdn 配置项
  • captcha.yaml 验证码配置
  • cors.yaml 跨域配置
  • upload.yaml 上传配置

配置读取

配置项的 key 和文件名是无关的,放到不同的文件只是为了分类,读取配置示例:

go
// 返回全局带读写锁的配置副本
cfg := config.Get()

// app.name
fmt.Printf("App.Name: %s", cfg.App.Name)

// server.port
addr := fmt.Sprintf(":%d", cfg.Server.Port)

TIP

  1. config 目录中的所有文件已内嵌进二进制,无法于运行时修改;若需运行时改配置,请使用 环境变量环境配置文件

  2. 配置系统基于 Viper 实现,它是适用于 Go 应用程序的完整配置解决方案,github 上有 30k star,非常完善和通用,获取 Viper 单例可以使用 config.Viper() 方法。

配置覆盖机制

所有配置项的值,可以被后续定义覆盖掉,如:

yaml
# config.yaml 文件
app:
  name: ai-go-admin
yaml
# test.yaml 文件
app:
  name: ai-go-admin-test

最终 app.name 的值是 ai-go-admin-test,即后者覆盖前者,哪怕在不同的文件。

TIP

  1. config 目录内的配置文件读取,是按字母升序([a-z])读取的,任意 key 后者覆盖前者;
  2. 为避免混乱,我们并不推荐您主动做以上这种覆盖,只是这一机制还用于环境配置文件(也是 yaml,可以直接覆盖所有配置 key)。

环境配置文件

项目根目录有一个 .env.yaml.example 文件,将它更名为 .env.yaml 后,即可作为系统的 环境配置文件,非 环境变量,但作用也是从外部(二进制外)动态设定配置。

.env.yaml 在系统编译时,并不会被嵌入二进制以内,而且它是按需建立的,也就是说:

  • 您可以不建立它,实现单二进制部署。
  • 也可以建立它,实现对所有配置项的动态覆盖(编译后的二进制也能读取外部的同级 .env.yaml 文件)。

TIP

  1. 环境配置文件 是一个 yaml 文件,天然能按 key 覆盖掉 config 目录内的所有配置值(受益于系统 文件配置的覆盖机制)。
  2. 环境变量 也有类似的功能,但使用本 环境配置文件 可以更加方便的批量覆盖;
  3. 您也可以单纯的将 环境配置文件 理解为开发环境专用配置,在开发环境建立它做单独的数据库信息等配置,而生产就不要了。

环境变量

系统只读取 全大写、下划线分割 的环境变量,您可以如下设置临时环境变量,系统会自动读取并覆盖同名的文件配置值:

bash
# Windows PowerShell
$env:APP_NAME="ai-go-admin-env-test";$env:SERVER_PORT=7000;air

# Linux / MacOS
APP_NAME=ai-go-admin-env-test SERVER_PORT=7000 air # AIR
APP_NAME=ai-go-admin-env-test SERVER_PORT=7000 ./aigo-linux-amd64 # 直接运行编译后的二进制

# Windows CMD
# 一行设定一个,不支持单行一次性设定
set APP_NAME=ai-go-admin-env-test
set SERVER_PORT=7000
air

环境变量最常用的场景是设定数据库配置信息,以下给出 linux 平台下的启动示例:

bash
DATABASE_WRITE_HOST="127.0.0.1" DATABASE_WRITE_PORT=5432 DATABASE_WRITE_USER="postgres" DATABASE_WRITE_DBNAME="aigo" DATABASE_WRITE_PASSWORD="admin888" ./aigo-linux-amd64