Integrations
Supports running protolint in GitHub workflows through various actions including github/super-linter, plexsystems/protolint-action, and yoheimuta/action-protolint
Supports JetBrains GoLand through the intellij-protolint plugin for Protocol Buffer linting
Integrates with JetBrains IDEs through the intellij-protolint plugin for Protocol Buffer linting
原林特
protolint 是用于协议缓冲区文件(proto2+proto3)的可插入式 linting/修复实用程序:
- 由于无需编译器,因此运行速度很快。
- 易于遵循官方风格指南。规则与风格指南完全对应。
- Fixer 会自动修复所有可能违反官方风格指南的行为。
- 允许使用协议缓冲区文件中的注释来禁用规则。
- 它对于必须保持 API 兼容性同时尽可能执行样式指南的项目很有用。
- 通过在发现的违规行为中插入评论,可以自动禁用某些规则。
- 加载插件以包含您的自定义 lint 规则。
- 已对所有规则进行测试。
- 许多集成支持。
- protoc插件
- 编辑器集成
- GitHub 动作
- CI 集成
演示
一旦 MCP 服务器配置完毕,您就可以要求任何 MCP 客户端(例如 Claude Desktop)对您的协议缓冲区文件进行 lint 和修复,如下所示:
此外,vim-protolint 的工作方式如下。
MCP 服务器
protolint 现在包括对模型上下文协议 (MCP)的支持,这使得 AI 模型可以直接与 protolint 交互。
用法
有关如何使用和集成 protolint 的 MCP 服务器功能的详细文档,请参阅MCP 文档。
安装
通过 Homebrew
可以使用 Homebrew 通过yoheimuta/protolint tap 在 Mac 或 Linux 上安装 protolint。
由于homebrew-core包含protolint,
您也可以通过brew install protolint.
这是默认安装的 tap。它更简单,但并非由同一作者维护。为了保持更新,我建议您先运行brew tap yoheimuta/protolint
。
通过 GitHub 发布
您还可以从此发布页面下载预先构建的二进制文件:
在每个版本的下载部分,您可以在 .tar.gz 包中找到预先构建的二进制文件。
使用维护的 Docker 镜像
protolint 附带一个 Docker 镜像yoheimuta/protolint ,允许您将 protolint 用作 Docker 工作流程的一部分。
来自源
如果有 Go 语言版本,可以从源代码安装二进制文件。但是,我建议使用预先构建的二进制文件,因为它不包含版本信息。
在 JavaScript / TypeScript 中
您可以使用 nodejs 包管理器(如npm
或yarn
来使用protolint
。
这会将对开发依赖项的引用添加到您的本地package.json
中。
安装过程中,会调用install.mjs脚本。它会从 GitHub 下载匹配的protolint
。与@electron/get类似,你可以使用以下环境变量来绕过下载:
环境变量 | 默认值 | 描述 |
---|---|---|
PROTOLINT_MIRROR_HOST | https://github.com | 托管二进制文件的 HTTP/Web 服务器基本 URL |
PROTOLINT_MIRROR_REMOTE_PATH | yoheimuta/protolint/下载/发布 | 远程主机上的档案路径 |
PROTOLINT_MIRROR_用户名 | HTTP 基本身份验证用户名 | |
PROTOLINT_MIRROR_密码 | HTTP 基本身份验证密码 | |
PROTOLINT_PROXY | 带有可选授权数据的 HTTP(S) 代理 |
在远程路径中,必须镜像来自发布页面的档案。
之后,您可以在 dev-scripts 中使用npx protolint
(以及所有提供的 protolint 参数)。
您可以在package.json
中添加一个protolint
节点,该节点可能包含lint
节点下方的protolint.yml
的内容,即配置的根元素将是protolint
。
如果您想要获得与 TSC 编译器匹配的输出,请使用记者tsc
。
在 Python 项目中
你可以在 Python 项目中使用protolint
作为 linter, pypi上的 wheel protolint-bin
包含针对不同平台的预编译二进制文件。只需将所需版本添加到pyproject.toml
或requirements.txt
即可。
下载的wheels将包含protolint
和protoc-gen-protolint
的已编译Go二进制文件。您的平台必须与支持的二进制平台兼容。
您可以将 linter 配置添加到pyproject.toml
中的tools.protolint
包中。
用法
protolint 默认不需要配置,对于大多数项目来说,它应该可以开箱即用。
版本控制集成
protolint 可用作预提交钩子。将其添加到你的仓库的.pre-commit-config.yaml
中,即可使用 Go 运行 protolint:
或者也可以使用它通过 Docker 运行 protolint:
编辑器集成
Visual Studio 代码
JetBrains IntelliJ IDEA、GoLand、WebStorm、PHPStorm、PyCharm……
Vim( ALE引擎)
Vim( Syntastic )
GitHub 动作
GitHub Action用于在工作流程中运行 protolint
CI 集成
Jenkins 插件
环境特定输出
您可以根据 CI/CD 环境的格式来格式化您的 linting。环境必须使用输出格式进行设置。目前,已实现以下输出:
环境 | 命令行值 | 描述 | 例子 |
---|---|---|---|
Github Actions | ci-gh | Github帮助 | ::warning file=example.proto,line=10,col=20,title=ENUM_NAMES_UPPER_CAMEL_CASE::EnumField name \"SECOND.VALUE\" must be CAPITALS_WITH_UNDERSCORES |
Azure DevOps | ci-az | Azure DevOps 帮助 | ##vso[task.logissue type=warning;sourcepath=example.proto;linenumber=10;columnnumber=20;code=ENUM_NAMES_UPPER_CAMEL_CASE;]EnumField name \"SECOND.VALUE\" must be CAPITALS_WITH_UNDERSCORES |
Gitlab CI/CD | ci-glab | 从示例进行逆向工程 | WARNING: ENUM_NAMES_UPPER_CAMEL_CASE example.proto(10,20) : EnumField name \"SECOND.VALUE\" must be CAPITALS_WITH_UNDERSCORES |
您还可以使用通用ci
格式化程序,它将创建一个通用问题匹配器。
使用ci-env
值,您可以从以下环境变量中指定模板:
环境变量 | 优先事项 | 意义 |
---|---|---|
PROTOLINT_CIREPORTER_TEMPLATE_STRING | 1 | 包含 Go 模板的字符串 |
PROTOLINT_CIREPORTER_TEMPLATE_FILE | 2 | 包含 Go 模板的文件路径 |
不需要添加由此产生的换行符,因为它会被自动添加。
可用字段如下:
Severity
:字符串形式的严重性(注意、警告或错误)
File
:包含错误的文件的路径
Line
: file
中包含错误的行(起始位置)
Column
: file
中包含错误的列(起始位置)
Rule
:出错的规则的名称
Message
:描述错误的错误消息
生成输出文件和 CI/CD 错误流
您可以创建与您的 CI/CD 环境匹配的特定输出,还可以创建输出文件,例如用于您的静态代码分析工具(如 github CodeQL 或 SonarQube)。
可以通过添加--add-reporter
标志来实现。请注意,该值的格式必须为<reporter-name>:<output-file-path>
(省略<
和>
)。
用作协议插件
protolint 还维护了一个二进制文件protoc-gen-protolint ,它作为 protoc 插件执行 lint 功能。详情请参阅cmd/protoc-gen-protolint/README.md 。
这在您已经有 protoc 插件工作流程的情况下很有用。
从 Go 代码调用
你也可以在 Go 代码中使用 protolint。详情请参阅Go 文档和lib/lint_test.go 。
规则
详细请参阅internal/addon/rules
。
规则集如下:
- 官方样式指南。此功能默认启用。基本上,这些规则可以通过附加
-fix
选项来修复违规行为。 - 非官方样式指南。默认情况下禁用。您可以使用
.protolint.yaml
文件启用每条规则。
命令行中的-fix
选项可以自动修复所有可修复规则报告的问题。请参阅下文的“可修复”列。
命令行中的-auto_disable
选项可以自动禁用自动禁用规则报告的所有问题。当修复现有违规行为导致兼容性中断时,此功能非常有用。请参阅下文的 AutoDisable 列。
- *1:这些规则不应该支持 AutoDisable,因为修复不会破坏它们的兼容性。您应该使用
-fix
运行 protolint。
官方的 | 可修复 | 自动禁用 | ID | 目的 |
---|---|---|---|---|
是的 | ✅ | ✅ | 枚举字段名称前缀 | 验证枚举字段名称是否以其 ENUM_NAME_UPPER_SNAKE_CASE 作为前缀。 |
是的 | ✅ | ✅ | 枚举字段名称大写 | 验证所有枚举字段名称是否均为大写且带下划线。 |
是的 | ✅ | ✅ | 枚举字段名称为零值结尾 | 验证零值枚举是否应带有后缀(例如“UNSPECIFIED”、“INVALID”)。默认值为“UNSPECIFIED”。您可以使用.protolint.yaml 配置具体的后缀。 |
是的 | ✅ | ✅ | 枚举名称大写驼峰格式 | 验证所有枚举名称是否都是 CamelCase(首字母大写)。 |
是的 | ✅ | *1 | 文件名小写 | 验证所有文件名是否均为 lower_snake_case.proto。您可以使用.protolint.yaml 配置排除的文件。 |
是的 | ✅ | ✅ | 字段名称小写 | 验证所有字段名称都是下划线分隔的名称。 |
是的 | ✅ | *1 | 导入已排序 | 验证所有导入都已排序。 |
是的 | ✅ | ✅ | 消息名称大写驼峰格式 | 验证所有消息名称是否为 CamelCase(首字母大写)。 |
是的 | ✅ | *1 | 命令 | 验证所有文件是否应按照特定方式排序。 |
是的 | ✅ | *1 | 包名称小写 | 验证包名称是否仅包含小写字母。 |
是的 | ✅ | ✅ | RPC_NAMES_UPPER_CAMEL_CASE | 验证所有 rpc 名称是否都是 CamelCase(首字母大写)。 |
是的 | ✅ | ✅ | 服务名称大写驼峰格式 | 验证所有服务名称是否均为 CamelCase(首字母大写)。 |
是的 | ✅ | ✅ | 重复字段名称复数 | 验证重复的字段名称是否为复数名称。 |
是的 | ✅ | *1 | 一致报价 | 验证字符串的引号使用是否一致。默认使用双引号。您可以使用.protolint.yaml 配置具体的引号。 |
是的 | ✅ | *1 | 缩进 | 强制使用一致的缩进样式。默认样式为 2 个空格。默认情况下,还会强制插入适当的新行。您可以使用.protolint.yaml 配置详细信息。 |
是的 | ✅ | *1 | PROTO3_FIELDS_AVOID_REQUIRED | 验证所有字段是否应避免成为 proto3 必需字段。 |
是的 | _ | ✅ | PROTO3_GROUPS_AVOID | 验证是否应避免使用 proto3 的所有组。 |
是的 | _ | *1 | 最大线长 | 强制执行最大行长度。每行的长度定义为该行中的 Unicode 字符数。默认值为 80 个字符。您可以使用.protolint.yaml 配置详细信息。 |
不 | _ | - | 服务名称结束 | 强制服务名称使用一致的后缀。您可以使用.protolint.yaml 配置特定的后缀。 |
不 | _ | - | FIELD_NAMES_EXCLUDE_PREPOSITIONS | 验证所有字段名称不包含介词(例如“for”、“during”、“at”)。您可以使用.protolint.yaml 配置特定的介词和排除的关键字。 |
不 | _ | - | 消息名称不包括介词 | 验证所有消息名称不包含介词(例如“With”、“For”)。您可以使用.protolint.yaml 配置特定的介词和排除的关键字。 |
不 | _ | - | RPC 名称大小写 | 验证所有 RPC 名称是否符合指定的约定。您需要使用.protolint.yaml 配置特定的约定。 |
不 | _ | - | 消息有评论 | 验证所有消息是否都有注释。您可以使用.protolint.yaml 配置强制使用 Golang 风格的注释。 |
不 | _ | - | 服务有评论 | 验证所有服务是否都有注释。您可以使用.protolint.yaml 配置强制使用 Golang 风格的注释。 |
不 | _ | - | RPCS_HAVE_COMMENT | 验证所有 rps 是否都有注释。你可以使用.protolint.yaml 配置强制使用 Golang 风格的注释。 |
不 | _ | - | 字段有评论 | 验证所有字段是否都有注释。你可以使用.protolint.yaml 配置强制使用 Golang 风格的注释。 |
不 | _ | - | 枚举有注释 | 验证所有枚举是否都有注释。你可以使用.protolint.yaml 配置强制使用 Golang 风格的注释。 |
不 | _ | - | 枚举字段有注释 | 验证所有枚举字段是否都有注释。你可以使用.protolint.yaml 配置强制使用 Golang 风格的注释。 |
不 | _ | - | 文件有注释 | 验证文件是否以文档注释开头。 |
不 | _ | - | 语法一致 | 验证语法是否为指定版本。默认值为 proto3。您可以使用.protolint.yaml 配置版本。 |
我建议您在.protolint.yaml
中添加all_default: true
,因为上面的所有 linters 都会自动启用,以便您在 protolint 更新时始终可以享受最大的好处。
这里有一些示例,展示了默认启用的良好样式。- 是-
不好的样式, +
是一种好的样式:
枚举字段名称前缀
枚举字段名称大写
枚举字段名称为零值结尾
枚举名称大写驼峰格式
字段名称小写
导入已排序
消息名称大写驼峰格式
命令
包名称小写
RPC_NAMES_UPPER_CAMEL_CASE
RPC_NAMES_UPPER_CAMEL_CASE
重复字段名称复数
缩进
一致报价
创建自定义规则
protolint 是可插入的 linter,因此您可以自由创建自定义 lint 规则。
完整的示例项目(又名插件)包含在_example/plugin目录下的此 repo 中。
记者
protolint 带有几个内置报告器(又名格式化程序)来控制 linting 结果的外观。
您可以在命令行中使用 -reporter 标志指定报告器。例如, -reporter junit
会使用 junit 报告器。
内置的报告器选项有:
- 普通(默认)
- Junit
- json
- 萨里夫
- sonar(SonarQube 通用问题格式)
- unix
- tsc(兼容 TypeScript 编译器)
配置
禁用协议缓冲区文件中的规则
可以使用 Protocol Buffer 文件中的注释禁用规则,注释格式如下。规则将一直处于禁用状态,直到文件末尾或 Linter 发现匹配的启用注释:
还可以通过附加 :next 或 :this 来修改禁用命令,以便分别仅将命令应用于此行(当前行)或下一行。
例如:
将命令行选项-auto_disable
设置为next
或this
会在发现问题时插入禁用命令。
您可以同时指定-fix
选项。支持 auto_disable 的规则会抑制导致架构不兼容的违规行为,而不是修复这些违规行为。
配置文件
protolint 可以使用名为.protolint.yaml
的配置文件进行操作。
有关配置文件规范,请参阅_example/config/.protolint.yaml 。
protolint 默认会自动在当前工作目录中搜索配置文件,然后依次查找父目录,直至文件系统的根目录。它可以使用-config_dir_path
标志搜索指定目录。它还可以使用--config_path
标志搜索指定文件。
退出代码
在对文件进行 linting 时,protolint 将使用以下退出代码之一退出:
0
:Linting 成功,并且没有 linting 错误。1
:Linting 成功,但至少有一个 linting 错误。2
:由于所有其他错误(例如解析、内部和运行时错误),Linting 失败。
动机
截至 2018 年 12 月 20 日,存在类似的 protobuf linters。
一个是Google的Protocol Buffers编译器的插件。
- 当您只想对文件进行 lint 时,创建编译环境可能会很繁琐。
- 并且编译文件通常比解析文件花费更多的时间。
另一个是命令行工具,它也可以检查协议缓冲区文件。
- 虽然它除了 lint 之外还有很多其他功能,但对于只想要 linter 的用户来说,它似乎很麻烦。
- lint 规则倾向于固执己见。
- 另外,规则集和官方的风格指南并不完全对应,需要详细理解规则和指南,然后才能准确地结合规则。
其他工具
我于 2019/12/17 写了一篇比较各种 Protocol Buffer Linters(包括 protolint)的文章。
依赖项
发展
发布
为了简化发布流程并减少人为错误,代码库中包含一个release.sh
脚本。该脚本可自动执行创建和推送新发布标签所需的步骤。
如何使用
运行以下命令来创建新版本:
执照
MIT 许可证(MIT)
This server cannot be installed
remote-capable server
The server can be hosted and run remotely because it primarily relies on remote services or has no dependency on the local environment.
protolint-mcp
Related MCP Servers
- GoMIT License
- PythonApache 2.0
- Rust
- TypeScriptMIT License