开源项目archivist:从JSON文件生成任意编程语言的数据结构定义(含Golang)

开源项目archivist:从JSON文件生成任意编程语言的数据结构定义(含Golang) Archivist 能够从 JSON 文件生成适用于任何编程语言的数据结构定义。它还提供了一个 Go 语言库,可以将管理运行时配置的工作简化为仅需几行代码。

特性

代码生成器

  • 为任意 JSON 字段推断最合适的数据类型
  • 通过 .meta 文件自定义数据类型。例如,将结构体替换为 map[string]…
  • 通过 .meta 文件支持扩展数据类型,包括引用、日期时间、持续时间和国际化(i18n)
  • 除了处理 .json 文件外,还支持处理 .js 文件,后者更便于手动编辑
  • 使用 paths 子命令显示所有节点路径和数据类型
  • 使用 orphan 子命令检测并删除孤立的生成文件
  • 自定义代码模板,任何编程语言均可从中受益

  • 仅用几行代码即可加载所有 .json 文件
  • 在运行时选择配置组和子组
  • 支持各种配置覆盖方式:文件级、内容级、内存内等
  • 支持扩展数据类型,包括引用、日期时间、持续时间和国际化(i18n)
  • 支持热重载(原子性地切换到全新的配置集合)
  • 支持热修补
  • 支持向后兼容性检查
  • 支持白名单和黑名单
  • 支持配置扩展,用于存储有组织的配置
  • 线程安全

更多信息,请访问 https://github.com/kingsgroupos/archivist


更多关于开源项目archivist:从JSON文件生成任意编程语言的数据结构定义(含Golang)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于开源项目archivist:从JSON文件生成任意编程语言的数据结构定义(含Golang)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Archivist 是一个功能强大的配置管理工具,特别适合处理复杂的 JSON 配置。对于 Go 开发者来说,它通过代码生成和运行时库简化了配置管理。

代码生成示例

假设有 config.json

{
  "server": {
    "port": 8080,
    "host": "localhost"
  },
  "features": {
    "logging": true
  }
}

运行以下命令生成 Go 结构体:

archivist generate -l go config.json

生成的 Go 代码:

package main

type Config struct {
    Server struct {
        Port int    `json:"port"`
        Host string `json:"host"`
    } `json:"server"`
    Features struct {
        Logging bool `json:"logging"`
    } `json:"features"`
}

运行时库使用示例

package main

import (
    "github.com/kingsgroupos/archivist/lib/go/archivist"
    "log"
)

func main() {
    // 加载配置
    loader, err := archivist.NewLoader(
        archivist.WithDir("configs"),
        archivist.WithGroup("production"),
    )
    if err != nil {
        log.Fatal(err)
    }

    // 获取配置
    cfg := &Config{}
    if err := loader.Load(cfg); err != nil {
        log.Fatal(err)
    }

    // 使用配置
    log.Printf("Server: %s:%d", cfg.Server.Host, cfg.Server.Port)
    
    // 热重载支持
    watcher := loader.Watch()
    go func() {
        for range watcher {
            // 配置已更新,重新加载
            if err := loader.Load(cfg); err != nil {
                log.Printf("Reload error: %v", err)
            }
        }
    }()
}

高级特性示例

  1. 类型自定义(通过 .meta 文件):
{
  "server.port": {
    "type": "uint16"
  }
}
  1. 引用支持
{
  "database": {
    "host": "localhost",
    "port": 5432,
    "url": "{{ref:database.host}}:{{ref:database.port}}"
  }
}
  1. 配置覆盖
// 内存覆盖
overrides := map[string]interface{}{
    "server.port": 9090,
}
loader.WithOverrides(overrides)

Archivist 的线程安全设计和热重载能力使其特别适合需要动态配置更新的微服务架构。代码生成确保类型安全,而运行时库提供了灵活的配置管理。

回到顶部