golang超快速轻量级OpenAPI规范检查与质量检测工具插件vacuum的使用

Golang 超快速轻量级 OpenAPI 规范检查与质量检测工具插件 vacuum 的使用

vacuum logo

vacuum 是世界上最快的 OpenAPI 和 Swagger 规范检查工具,采用 Golang 编写,并受到 Spectral 的启发。它也与现有的 Spectral 规则集兼容。

安装方式

使用 Homebrew 安装

brew install daveshanley/vacuum/vacuum

使用 npm 安装

npm i -g @quobix/vacuum

使用 yarn 安装

yarn global add @quobix/vacuum

使用 curl 安装

curl -fsSL https://quobix.com/scripts/install_vacuum.sh | sh

使用 Docker 安装

docker pull dshanley/vacuum

运行方式:

docker run --rm -v $PWD:/work:ro dshanley/vacuum lint <your-openapi-spec.yaml>

使用 Go 运行

如果已安装 Go >= 1.16,可以使用 go run 构建并运行:

go run github.com/daveshanley/vacuum@latest lint <your-openapi-spec.yaml>

基本使用示例

检查 OpenAPI 规范

# 基本检查
./vacuum lint <your-openapi-spec.yaml>

# 显示详细检查结果
./vacuum lint -d <your-openapi-spec.yaml>

# 显示错误信息并包含代码片段
./vacuum lint -d -s <your-openapi-spec.yaml>

# 仅显示错误信息
./vacuum lint -d -e <your-openapi-spec.yaml>

批量检查多个文件

# 检查多个特定文件
./vacuum lint -d <spec1.yaml> <spec2.yaml> <spec3.yaml>

# 使用 glob 模式检查多个文件
./vacuum lint -d some/path/**/*.yaml

按类别检查

# 仅检查 schema 相关问题
./vacuum lint -d -c schemas <your-openapi-spec.yaml>

可用类别选项:

  • examples
  • operations
  • information
  • descriptions
  • schemas
  • security
  • tags
  • validation
  • owasp

报告生成

生成 HTML 报告

./vacuum html-report <your-openapi-spec.yaml|vacuum-report.json.gz> <report-name.html>

生成 Spectral 兼容的报告

./vacuum spectral-report <your-openapi-spec.yaml> <report-output-name.json>

生成 vacuum 报告

# 生成压缩报告
./vacuum report -c <your-openapi-spec.yaml> <report-prefix>

交互式仪表盘

./vacuum dashboard <your-openapi-spec.yaml|vacuum-report.json.gz>

自定义规则集

vacuum 支持使用自定义的 Spectral 兼容规则集:

# 关闭所有规则
./vacuum lint -r rulesets/examples/norules-ruleset.yaml <your-openapi-spec.yaml>

# 仅使用推荐规则
./vacuum lint -r rulesets/examples/recommended-ruleset.yaml <your-openapi-spec.yaml>

# 使用特定规则
./vacuum lint -r rulesets/examples/specific-ruleset.yaml <your-openapi-spec.yaml>

# 使用自定义规则
./vacuum lint -r rulesets/examples/custom-ruleset.yaml <your-openapi-spec.yaml>

# 启用所有规则
./vacuum lint -r rulesets/examples/all-ruleset.yaml <your-openapi-spec.yaml>

忽略特定检查错误

可以创建忽略文件来忽略特定检查错误:

# ignore-file.yaml 示例
<rule-id-1>:
  - <json_path_to_error_or_warning_1>
  - <json_path_to_error_or_warning_2>
<rule-id-2>:
  - <json_path_to_error_or_warning_1>
  - <json_path_to_error_or_warning_2>

使用忽略文件:

./vacuum lint --ignore-file <path-to-ignore-file.yaml> -d <your-openapi-spec.yaml>

配置

配置文件

可以在 vacuum.conf.yaml 文件中配置 vacuum,默认搜索路径:

  1. 工作目录
  2. $XDG_CONFIG_HOME
  3. ${HOME}/.config

配置文件示例:

time: true
base: 'http://example.com'
lint:
  silent: true

环境变量

可以使用环境变量配置全局标志,格式为:VACUUM_<flag>。如果标志包含 -,请替换为 _

vacuum 是一个功能强大且高效的 OpenAPI 规范检查工具,适用于各种规模的 API 项目。它的速度和灵活性使其成为 API 开发工作流程中的理想选择。


更多关于golang超快速轻量级OpenAPI规范检查与质量检测工具插件vacuum的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang超快速轻量级OpenAPI规范检查与质量检测工具插件vacuum的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用vacuum进行Golang OpenAPI规范检查与质量检测

vacuum是一个超快速、轻量级的OpenAPI/Swagger规范检查工具,专为高性能验证和linting设计。下面我将详细介绍如何在Golang项目中使用vacuum。

vacuum简介

vacuum的主要特点:

  • 极快的验证速度(比传统工具快10-100倍)
  • 支持OpenAPI 2.0/3.0/3.1规范
  • 内置丰富的linting规则
  • 可自定义规则集
  • 支持多种输出格式(JSON、YAML、HTML等)

安装vacuum

1. 直接安装

go install github.com/daveshanley/vacuum@latest

2. 作为库引入

go get github.com/daveshanley/vacuum

基本使用示例

1. 命令行使用

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	// 验证OpenAPI文档
	cmd := exec.Command("vacuum", "lint", "openapi.yaml")
	output, err := cmd.CombinedOutput()
	if err != nil {
		fmt.Printf("验证失败: %v\n", err)
		os.Exit(1)
	}
	fmt.Println(string(output))
}

2. 编程方式使用

package main

import (
	"fmt"
	"github.com/daveshanley/vacuum/model"
	"github.com/daveshanley/vacuum/motor"
	"github.com/daveshanley/vacuum/rulesets"
)

func main() {
	// 1. 加载OpenAPI规范文件
	specBytes, err := os.ReadFile("openapi.yaml")
	if err != nil {
		fmt.Printf("无法读取文件: %v\n", err)
		return
	}

	// 2. 创建规则集(使用内置推荐规则)
	defaultRuleset := rulesets.BuildDefaultRuleSets()

	// 3. 执行验证
	resultSet := motor.ApplyRulesToRuleSet(&motor.RuleSetExecution{
		RuleSet: defaultRuleset,
		Spec:    specBytes,
	})

	// 4. 处理结果
	if resultSet.Errors != nil {
		fmt.Println("发现验证错误:")
		for _, err := range resultSet.Errors {
			fmt.Printf("- %s (位置: %d:%d)\n", err.Message, err.Range.Start.Line, err.Range.Start.Column)
		}
	} else {
		fmt.Println("OpenAPI规范验证通过!")
	}
}

高级功能

1. 自定义规则

func customRulesExample() {
	// 创建自定义规则集
	customRuleset := rulesets.CreateRuleSet(
		"我的自定义规则集",
		"自定义OpenAPI验证规则",
		rulesets.RuleSetDefinition{
			"operation-tags": &rulesets.Rule{
				Description: "每个操作必须有至少一个标签",
				Severity:    rulesets.Error,
				Recommended: true,
				RuleCategory: rulesets.RuleCategories{
					rulesets.OperationsCategory,
				},
				Given: "$.paths[*][*]",
				Then: &rulesets.RuleAction{
					Field: "tags",
					Function: "truthy",
				},
			},
		},
	)

	// 使用自定义规则集验证
	resultSet := motor.ApplyRulesToRuleSet(&motor.RuleSetExecution{
		RuleSet: customRuleset,
		Spec:    specBytes,
	})
}

2. 生成HTML报告

func generateHTMLReport() {
	resultSet := motor.ApplyRulesToRuleSet(&motor.RuleSetExecution{
		RuleSet: rulesets.BuildDefaultRuleSets(),
		Spec:    specBytes,
	})

	// 生成HTML报告
	htmlReport := model.GenerateHTMLReport(resultSet)
	err := os.WriteFile("report.html", []byte(htmlReport), 0644)
	if err != nil {
		fmt.Printf("无法生成报告: %v\n", err)
		return
	}
	fmt.Println("HTML报告已生成: report.html")
}

集成到CI/CD流程

package main

import (
	"fmt"
	"os"
	"github.com/daveshanley/vacuum/motor"
	"github.com/daveshanley/vacuum/rulesets"
)

func main() {
	// 在CI中严格验证
	specBytes, _ := os.ReadFile("openapi.yaml")
	
	strictRules := rulesets.BuildDefaultRuleSets()
	strictRules.Rules["operation-operationId"] = &rulesets.Rule{
		Description: "强制每个操作必须有operationId",
		Severity:    rulesets.Error,
		Recommended: true,
		RuleCategory: rulesets.RuleCategories{
			rulesets.OperationsCategory,
		},
		Given: "$.paths[*][*]",
		Then: &rulesets.RuleAction{
			Field: "operationId",
			Function: "truthy",
		},
	}

	result := motor.ApplyRulesToRuleSet(&motor.RuleSetExecution{
		RuleSet: strictRules,
		Spec:    specBytes,
	})

	if len(result.Errors) > 0 {
		fmt.Println("CI验证失败:")
		for _, err := range result.Errors {
			fmt.Printf("- %s\n", err.Message)
		}
		os.Exit(1)
	}
	fmt.Println("OpenAPI规范验证通过,CI继续执行")
}

性能优化技巧

  1. 并行验证:vacuum内置并行处理,对于大型文档特别有效
  2. 缓存规则集:重复验证时复用规则集对象
  3. 选择性验证:只加载需要的规则

vacuum是Golang生态中验证OpenAPI规范的优秀工具,其出色的性能和灵活性使其成为API开发流程中的理想选择。

回到顶部