golang跨平台配置文件验证工具插件库config-file-validator的使用

Golang跨平台配置文件验证工具插件库config-file-validator的使用

简介

Config File Validator是一个跨平台的CLI工具,用于验证不同类型的配置文件格式。

Config File Validator Logo

支持的配置文件格式

  • Apple PList XML
  • CSV
  • EDITORCONFIG
  • ENV
  • HCL
  • HOCON
  • INI
  • JSON
  • Properties
  • TOML
  • XML
  • YAML

安装

有几种安装config-file-validator工具的方法:

二进制发布版

从发布页面下载并解压。

使用Aqua安装

aqua g -i Boeing/config-file-validator

使用Scoop安装

scoop install config-file-validator

使用go install安装

go install github.com/Boeing/config-file-validator/cmd/validator@v1.8.0

使用示例

基本使用

如果省略搜索路径,它将搜索当前目录

validator /path/to/search

多个搜索路径

支持多个搜索路径,结果将合并为单个报告

validator /path/to/search /another/path/to/search

排除目录

排除搜索路径中的子目录

validator --exclude-dirs=/path/to/search/tests /path/to/search

排除文件类型

排除搜索路径中的文件类型。可用的文件类型有csvenvhclhoconinijsonplistpropertiestomlxmlyamlyml

validator --exclude-file-types=json /path/to/search

自定义递归深度

默认没有递归限制。如果需要,可以将递归深度设置为整数值。如果将深度设置为0,将禁用递归,仅验证搜索路径中的文件。

validator --depth=0 /path/to/search

自定义报告输出

您可以自定义报告输出并将结果保存到文件(默认名称是result.{extension})。可用的报告类型有standardjunitjsonsarif。您可以通过链接--reporter标志来指定多个报告类型。

validator --reporter=json:- /path/to/search
validator --reporter=json:output.json --reporter=standard /path/to/search

分组报告输出

按文件类型、目录或通过-失败分组报告输出。支持一个或多个分组。

validator -groupby filetype
validator -groupby directory,pass-fail

抑制输出

传递--quiet标志会抑制所有输出到stdout。如果有无效的配置文件,验证器工具将以1退出。执行中的任何错误(如无效路径)仍将显示。

validator --quiet /path/to/search

使用glob模式搜索文件

使用-globbing标志验证匹配指定模式的文件。将模式作为位置参数包含在双引号中。支持多个glob模式和直接文件路径。

# 验证目录中所有`.json`文件
validator -globbing "/path/to/files/*.json"

# 递归验证子目录中所有`.json`文件
validator -globbing "/path/to/files/**/*.json"

# 混合glob模式和路径
validator -globbing "/path/*.json" /path/to/search

环境变量

config-file-validator支持通过环境变量设置选项。如果同时设置了命令行标志和环境变量,命令行标志将优先。支持的环境变量如下:

环境变量 等效标志
CFV_DEPTH -depth
CFV_EXCLUDE_DIRS -exclude-dirs
CFV_EXCLUDE_FILE_TYPES -exclude-file-types
CFV_REPORTER -reporter
CFV_GROUPBY -groupby
CFV_QUIET -quiet
CFV_GLOBBING -globbing

构建

项目可以从源代码下载和构建,需要Go 1.21+环境。成功构建后,可以将二进制文件移动到操作系统PATH上的位置。

macOS构建

CGO_ENABLED=0 \
GOOS=darwin \
GOARCH=amd64 \ # 对于Apple Silicon使用arm64
go build \
-ldflags='-w -s -extldflags "-static"' \
-tags netgo \
-o validator \
cmd/validator/validator.go

Linux构建

CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64 \
go build \
-ldflags='-w -s -extldflags "-static"' \
-tags netgo \
-o validator \
cmd/validator/validator.go

Windows构建

CGO_ENABLED=0 \
GOOS=windows \
GOARCH=amd64 \
go build \
-ldflags='-w -s -extldflags "-static"' \
-tags netgo \
-o validator.exe \
cmd/validator/validator.go

Docker构建

您也可以使用提供的Dockerfile将config file validator工具构建为容器

docker build . -t config-file-validator:v1.8.0

完整示例

以下是一个完整的Go示例,展示如何在代码中使用config-file-validator库:

package main

import (
	"fmt"
	"log"

	"github.com/Boeing/config-file-validator/pkg/finder"
	"github.com/Boeing/config-file-validator/pkg/validator"
)

func main() {
	// 初始化文件查找器
	fileFinder := finder.FileSystemFinderInit(
		finder.WithPathRoots("/path/to/search"), // 设置搜索路径
		finder.WithExcludeDirs("tests"),         // 排除目录
		finder.WithDepth(1),                    // 设置递归深度
	)

	// 查找文件
	files, err := fileFinder.Find()
	if err != nil {
		log.Fatalf("查找文件失败: %v", err)
	}

	// 初始化验证器
	validator := validator.Init()

	// 验证文件
	results := validator.Validate(files)

	// 处理结果
	for _, result := range results {
		if result.IsValid {
			fmt.Printf("文件 %s 验证通过\n", result.FilePath)
		} else {
			fmt.Printf("文件 %s 验证失败: %v\n", result.FilePath, result.Error)
		}
	}
}

贡献

我们欢迎贡献!请参考我们的贡献指南。

许可证

Config File Validator根据Apache 2.0许可证发布。


更多关于golang跨平台配置文件验证工具插件库config-file-validator的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang跨平台配置文件验证工具插件库config-file-validator的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang跨平台配置文件验证工具config-file-validator使用指南

config-file-validator是一个用于验证配置文件格式和内容的Golang库,支持跨平台使用。下面我将详细介绍其使用方法并提供示例代码。

安装

首先安装该库:

go get github.com/smallstep/config-file-validator

基本功能

该库支持验证多种格式的配置文件:

  • JSON
  • YAML
  • TOML
  • INI
  • HCL
  • 环境变量文件(.env)

核心概念

  1. 验证器(Validator): 负责验证特定格式的文件
  2. 文件类型检测(FileTypeDetector): 根据文件扩展名或内容检测文件类型
  3. 验证结果(ValidationResult): 包含验证结果信息

使用示例

1. 基本使用

package main

import (
	"fmt"
	"log"

	validator "github.com/smallstep/config-file-validator"
)

func main() {
	// 创建默认验证器
	fileValidator, err := validator.New()
	if err != nil {
		log.Fatal(err)
	}

	// 验证单个文件
	result, err := fileValidator.ValidateFile("config.yaml")
	if err != nil {
		log.Fatal(err)
	}

	if !result.IsValid {
		fmt.Printf("配置文件 %s 验证失败:\n", result.FilePath)
		for _, err := range result.Errors {
			fmt.Printf("- %s\n", err)
		}
	} else {
		fmt.Printf("配置文件 %s 验证通过\n", result.FilePath)
	}
}

2. 验证目录下所有配置文件

func validateDirectory() {
	fileValidator, err := validator.New()
	if err != nil {
		log.Fatal(err)
	}

	// 验证目录下所有配置文件
	results, err := fileValidator.ValidateDirectory("./configs")
	if err != nil {
		log.Fatal(err)
	}

	for _, result := range results {
		if !result.IsValid {
			fmt.Printf("%s 验证失败:\n", result.FilePath)
			for _, err := range result.Errors {
				fmt.Printf("- %s\n", err)
			}
		}
	}
}

3. 自定义验证器

func customValidator() {
	// 只启用JSON和YAML验证器
	validators := []validator.Validator{
		validator.JSONValidator{},
		validator.YAMLValidator{},
	}

	// 创建自定义文件类型检测器
	fileTypeDetector := validator.DefaultFileTypeDetector{}

	fileValidator, err := validator.New(
		validator.WithValidators(validators),
		validator.WithFileTypeDetector(fileTypeDetector),
	)
	if err != nil {
		log.Fatal(err)
	}

	// 使用自定义验证器验证文件
	result, err := fileValidator.ValidateFile("custom-config.json")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("验证结果: %+v\n", result)
}

4. 验证文件内容(不通过文件)

func validateContent() {
	fileValidator, err := validator.New()
	if err != nil {
		log.Fatal(err)
	}

	yamlContent := `
app:
  name: myapp
  port: 8080
`

	// 验证YAML内容
	result, err := fileValidator.ValidateContent("example.yaml", []byte(yamlContent))
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("内容验证结果: %+v\n", result)
}

高级功能

1. 添加自定义验证器

type CustomValidator struct{}

func (v CustomValidator) Validate(filePath string, content []byte) (validator.ValidationResult, error) {
	// 实现自定义验证逻辑
	return validator.ValidationResult{
		FilePath: filePath,
		IsValid:  true,
	}, nil
}

func (v CustomValidator) SupportedFileExtensions() []string {
	return []string{".custom"}
}

func customValidatorExample() {
	customValidator := CustomValidator{}
	
	fileValidator, err := validator.New(
		validator.WithValidators([]validator.Validator{
			validator.JSONValidator{},
			customValidator,
		}),
	)
	if err != nil {
		log.Fatal(err)
	}

	// 使用自定义验证器验证文件
	result, err := fileValidator.ValidateFile("config.custom")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("自定义验证结果: %+v\n", result)
}

2. 忽略特定文件

func validateWithIgnore() {
	fileValidator, err := validator.New(
		validator.WithIgnorePatterns([]string{"*.tmp", "temp/*"}),
	)
	if err != nil {
		log.Fatal(err)
	}

	// 会忽略所有.tmp文件和temp目录下的文件
	results, err := fileValidator.ValidateDirectory(".")
	if err != nil {
		log.Fatal(err)
	}

	for _, result := range results {
		fmt.Printf("验证文件: %s, 结果: %v\n", result.FilePath, result.IsValid)
	}
}

最佳实践

  1. 在CI/CD管道中使用: 可以在构建或部署前验证所有配置文件
  2. 与单元测试结合: 编写测试用例验证关键配置文件
  3. 自定义验证规则: 扩展基础验证器添加业务特定规则

注意事项

  1. 大文件验证可能会消耗较多内存
  2. 复杂嵌套结构的验证可能需要自定义验证器
  3. 验证器不保证配置值的业务逻辑正确性,只验证格式有效性

通过config-file-validator,你可以轻松地为Golang项目添加强大的配置文件验证功能,确保配置文件的正确性和一致性。

回到顶部