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
protolint ist das steckbare Dienstprogramm zum Lintisieren/Fixieren von Protokollpufferdateien (proto2+proto3):
- Läuft schnell, da ohne Compiler funktioniert.
- Der offizielle Styleguide ist leicht zu befolgen. Die Regeln und der Styleguide entsprechen einander genau.
- Fixer behebt automatisch alle möglichen Verstöße gegen den offiziellen Styleguide.
- Ermöglicht das Deaktivieren von Regeln mit einem Kommentar in einer Protokollpufferdatei.
- Es ist nützlich für Projekte, bei denen die API-Kompatibilität gewahrt werden muss, während gleichzeitig der Styleguide so weit wie möglich durchgesetzt werden muss.
- Einige Regeln können automatisch deaktiviert werden, indem Kommentare zu den festgestellten Verstößen eingefügt werden.
- Lädt Plugins, um Ihre benutzerdefinierten Lint-Regeln zu enthalten.
- Auf alle Regeln getestet.
- Viele Integrationsunterstützungen.
- Protokoll-Plugin
- Editor-Integration
- GitHub-Aktion
- CI-Integration
Demo
Sobald der MCP-Server konfiguriert ist, können Sie beliebige MCP-Clients wie Claude Desktop bitten, Ihre Protocol Buffer-Dateien wie folgt zu linten und zu reparieren:
Außerdem funktioniert vim-protolint wie folgt.
MCP-Server
Protolint unterstützt jetzt das Model Context Protocol (MCP) , wodurch KI-Modelle direkt mit Protolint interagieren können.
Verwendung
Eine ausführliche Dokumentation zur Verwendung und Integration der MCP-Serverfunktionalität von Protolint finden Sie in der MCP-Dokumentation .
Installation
Über Homebrew
Protolint kann für Mac oder Linux mit Homebrew über den Tap yoheimuta/protolint installiert werden.
Da Homebrew-Core protolint,
können Sie es auch mit „ brew install protolint.
Dies ist der standardmäßig installierte Tap. Er ist einfacher, wird aber nicht vom selben Autor gepflegt. Um ihn aktuell zu halten, empfehle ich, zuerst brew tap yoheimuta/protolint
auszuführen.
Über GitHub-Releases
Sie können auch eine vorgefertigte Binärdatei von dieser Versionsseite herunterladen:
Im Downloadbereich jeder Version finden Sie vorgefertigte Binärdateien in .tar.gz-Paketen.
Verwenden Sie das gepflegte Docker-Image
Protolint liefert ein Docker-Image yoheimuta/protolint , mit dem Sie Protolint als Teil Ihres Docker-Workflows verwenden können.
Aus der Quelle
Die Binärdatei kann aus dem Quellcode installiert werden, sofern Go verfügbar ist. Ich empfehle jedoch die Verwendung einer der vorgefertigten Binärdateien, da diese keine Versionsinformationen enthalten.
Innerhalb von JavaScript / TypeScript
Sie können protolint
mit Ihrem Node.js-Paketmanager wie npm
oder yarn
verwenden.
Dadurch wird Ihrem lokalen package.json
ein Verweis auf eine Entwicklungsabhängigkeit hinzugefügt.
Während der Installation wird das Skript install.mjs aufgerufen. Es lädt das passende protolint
von GitHub herunter. Wie bei @electron/get können Sie den Download mithilfe der folgenden Umgebungsvariablen umgehen:
Umgebungsvariable | Standardwert | Beschreibung |
---|---|---|
PROTOLINT_MIRROR_HOST | https://github.com | HTTP/Webserver-Basis-URL, auf der die Binärdateien gehostet werden |
PROTOLINT_MIRROR_REMOTE_PATH | yoheimuta/protolint/download/releases | Pfad zu den Archiven auf dem Remote-Host |
PROTOLINT_MIRROR_USERNAME | HTTP Basic-Auth-Benutzername | |
PROTOLINT_MIRROR_PASSWORD | HTTP-Basisauthentifizierungskennwort | |
PROTOLINT_PROXY | HTTP(S)-Proxy mit optionalen Authentifizierungsdaten |
Innerhalb des Remote-Pfads müssen die Archive von der Release -Seite gespiegelt werden.
Danach können Sie npx protolint
(mit allen bereitgestellten Protolint-Argumenten) in Ihren Dev-Skripten verwenden.
Sie können Ihrem package.json
einen protolint
Knoten hinzufügen, der den Inhalt von protolint.yml
unterhalb des lint
Knotens enthalten kann, d. h. das Stammelement der Konfiguration wird protolint
sein.
Wenn Sie eine Ausgabe erhalten möchten, die mit dem TSC-Compiler übereinstimmt, verwenden Sie Reporter tsc
.
Innerhalb von Python-Projekten
Sie können protolint
als Linter in Ihren Python-Projekten verwenden. Das Wheel protolint-bin
auf pypi enthält die vorkompilierten Binärdateien für verschiedene Plattformen. Fügen Sie einfach die gewünschte Version zu Ihrer pyproject.toml
oder requirements.txt
hinzu.
Die heruntergeladenen Wheels enthalten die kompilierten Go-Binärdateien für protolint
und protoc-gen-protolint
. Ihre Plattform muss mit den unterstützten Binärplattformen kompatibel sein.
Sie können die Linter-Konfiguration zum Paket tools.protolint
in pyproject.toml
hinzufügen.
Verwendung
Protolint erfordert standardmäßig keine Konfiguration und sollte für die meisten Projekte sofort funktionieren.
Versionskontrollintegration
Protolint ist als Pre-Commit- Hook verfügbar. Fügen Sie diesen zu Ihrer .pre-commit-config.yaml
in Ihrem Repository hinzu, um Protolint mit Go auszuführen:
oder verwenden Sie alternativ dies, um Protolint mit Docker auszuführen:
Editor-Integration
Visual Studio Code
JetBrains IntelliJ IDEA, GoLand, WebStorm, PHPStorm, PyCharm …
Vim ( ALE-Engine )
Vim ( Syntastisch )
GitHub-Aktion
Eine GitHub-Aktion zum Ausführen von Protolint in Ihren Workflows
- github/super-linter
- plexsystems/protolint-aktion
- yoheimuta/action-protolint – Integriert mit reviewdog
CI-Integration
Jenkins-Plugins
- warnings-ng und alle, die violatons-lib verwenden
Umgebungsspezifische Ausgabe
Es ist möglich, Ihr Linting entsprechend der Formatierung der CI/CD-Umgebung zu formatieren. Die Umgebung muss mithilfe des Ausgabeformats festgelegt werden. Aktuell wird folgende Ausgabe realisiert:
Umfeld | Befehlszeilenwert | Beschreibung | Beispiel |
---|---|---|---|
Github-Aktionen | ci-gh | Github-Hilfe | ::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-Hilfe | ##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 | Reverse Engineering aus Beispielen | WARNING: ENUM_NAMES_UPPER_CAMEL_CASE example.proto(10,20) : EnumField name \"SECOND.VALUE\" must be CAPITALS_WITH_UNDERSCORES |
Sie können auch den allgemeinen ci
Formatierer verwenden, der einen allgemeinen Problem-Matcher erstellt.
Mit dem Wert ci-env
können Sie die Vorlage aus den folgenden Umgebungsvariablen angeben:
Umgebungsvariable | Priorität | Bedeutung |
---|---|---|
PROTOLINT_CIREPORTER_TEMPLATE_STRING | 1 | Zeichenfolge, die eine Go-Vorlage enthält |
PROTOLINT_CIREPORTER_TEMPLATE_FILE | 2 | Pfad zu einer Datei, die eine Go-Vorlage enthält |
Der resultierende Zeilenumbruch darf nicht hinzugefügt werden, da er automatisch hinzugefügt wird.
Die folgenden Felder sind verfügbar:
Severity
: Der Schweregrad als Zeichenfolge (entweder Hinweis, Warnung oder Fehler)
File
: Pfad zur Datei, die den Fehler enthält
Line
: Zeile innerhalb der file
, die den Fehler enthält (Startposition)
Column
: Spalte innerhalb der file
, die den Fehler enthält (Startposition)
Rule
: Der Name der Regel, die fehlerhaft ist
Message
: Die Fehlermeldung, die den Fehler beschreibt
Erstellen einer Ausgabedatei und eines CI/CD-Fehlerstreams
Sie können eine spezifische Ausgabe erstellen, die zu Ihrer CI/CD-Umgebung passt, und auch eine Ausgabedatei erstellen, z. B. für Ihre statischen Codeanalysetools wie GitHub CodeQL oder SonarQube.
Dies kann durch Hinzufügen des Flags --add-reporter
erreicht werden. Beachten Sie, dass der Wert im Format <reporter-name>:<output-file-path>
(ohne <
und >
) angegeben werden muss.
Verwendung als Protokoll-Plugin
Protolint verwaltet außerdem die Binärdatei protoc-gen-protolint , die die Lint-Funktionalität als Protoc-Plugin ausführt. Weitere Informationen finden Sie unter cmd/protoc-gen-protolint/README.md .
Dies ist in Situationen nützlich, in denen Sie bereits über einen Protokoll-Plugin-Workflow verfügen.
Anruf vom Go-Code
Sie können Protolint auch aus Go-Code verwenden. Weitere Informationen finden Sie in der Go-Dokumentation und in lib/lint_test.go .
Regeln
Siehe internal/addon/rules
im Detail.
Der Regelsatz lautet wie folgt:
- Offizieller Style Guide . Standardmäßig aktiviert. Regelverstöße können durch Anhängen der Option
-fix
behoben werden. - Inoffizieller Style Guide. Standardmäßig ist diese Regel deaktiviert. Sie können jede Regel mit
.protolint.yaml
aktivieren.
Mit der Option -fix
in der Befehlszeile können alle von behebbaren Regeln gemeldeten Probleme automatisch behoben werden. Siehe „Behebbare Spalten“ weiter unten.
Mit der Option -auto_disable
in der Kommandozeile können Sie alle von Auto-Disable-Regeln gemeldeten Probleme automatisch deaktivieren. Diese Funktion ist hilfreich, wenn die Behebung bestehender Verstöße die Kompatibilität beeinträchtigt. Siehe AutoDisable-Spalten weiter unten.
- *1: Diese Regeln unterstützen AutoDisable nicht, da die Fixes ihre Kompatibilität nicht beeinträchtigen. Sie sollten Protolint mit
-fix
ausführen.
Offiziell | Reparierbar | AutoDisable | AUSWEIS | Zweck |
---|---|---|---|---|
Ja | ✅ | ✅ | ENUM_FIELD_NAMES_PREFIX | Überprüft, ob den Enumerationsfeldnamen das Präfix ENUM_NAME_UPPER_SNAKE_CASE vorangestellt ist. |
Ja | ✅ | ✅ | ENUM_FIELD_NAMES_UPPER_SNAKE_CASE | Überprüft, ob alle Enumerationsfeldnamen in GROSSBUCHSTABEN MIT UNTERSTREICHERN geschrieben sind. |
Ja | ✅ | ✅ | ENUM_FIELD_NAMES_ZERO_VALUE_END_WITH | Überprüft, ob die Nullwert-Enumeration das Suffix (z. B. „UNSPECIFIED“, „INVALID“) haben soll. Der Standardwert ist „UNSPECIFIED“. Sie können das spezifische Suffix mit .protolint.yaml konfigurieren. |
Ja | ✅ | ✅ | ENUM_NAMES_UPPER_CAMEL_CASE | Überprüft, ob alle Enumerationsnamen in CamelCase geschrieben sind (mit einem großen Anfangsbuchstaben). |
Ja | ✅ | *1 | DATEINAMEN IN KLEINBUCHSTABEN | Überprüft, ob alle Dateinamen lower_snake_case.proto lauten. Sie können die ausgeschlossenen Dateien mit .protolint.yaml konfigurieren. |
Ja | ✅ | ✅ | FIELD_NAMES_LOWER_SNAKE_CASE | Überprüft, ob alle Feldnamen durch Unterstriche getrennte Namen sind. |
Ja | ✅ | *1 | IMPORTS_SORTED | Überprüft, ob alle Importe sortiert sind. |
Ja | ✅ | ✅ | MESSAGE_NAMES_UPPER_CAMEL_CASE | Überprüft, ob alle Nachrichtennamen in CamelCase (mit großem Anfangsbuchstaben) geschrieben sind. |
Ja | ✅ | *1 | BEFEHL | Überprüft, ob alle Dateien in der angegebenen Weise sortiert werden sollen. |
Ja | ✅ | *1 | PAKETNAME IN KLEINBUCHSTABEN | Überprüft, ob der Paketname nur Kleinbuchstaben enthalten darf. |
Ja | ✅ | ✅ | RPC_NAMES_UPPER_CAMEL_CASE | Überprüft, ob alle RPC-Namen in CamelCase geschrieben sind (mit einem großen Anfangsbuchstaben). |
Ja | ✅ | ✅ | SERVICE_NAMES_UPPER_CAMEL_CASE | Überprüft, ob alle Dienstnamen in CamelCase (mit großem Anfangsbuchstaben) geschrieben sind. |
Ja | ✅ | ✅ | WIEDERHOLTE FELDNAMEN IM PLURAL | Überprüft, ob wiederholte Feldnamen Pluralnamen sind. |
Ja | ✅ | *1 | ZITAT_KONSISTENT | Überprüft, ob die Verwendung von Anführungszeichen für Zeichenfolgen konsistent ist. Standardmäßig werden doppelte Anführungszeichen verwendet. Sie können die spezifischen Anführungszeichen mit .protolint.yaml konfigurieren. |
Ja | ✅ | *1 | EINZUG | Erzwingt einen einheitlichen Einrückungsstil. Der Standardstil besteht aus zwei Leerzeichen. Das Einfügen entsprechender Zeilenumbrüche wird ebenfalls standardmäßig erzwungen. Sie können die Details mit .protolint.yaml konfigurieren. |
Ja | ✅ | *1 | PROTO3_FIELDS_AVOID_REQUIRED | Überprüft, ob alle Felder für Proto3 als erforderlich eingestuft werden. |
Ja | _ | ✅ | PROTO3_GRUPPEN_VERMEIDEN | Überprüft, ob für Proto3 alle Gruppen vermieden werden sollten. |
Ja | _ | *1 | MAX_LINE_LENGTH | Erzwingt eine maximale Zeilenlänge. Die Zeilenlänge wird durch die Anzahl der Unicode-Zeichen in der Zeile definiert. Der Standardwert beträgt 80 Zeichen. Sie können die Details mit .protolint.yaml konfigurieren. |
NEIN | _ | - | SERVICE_NAMES_END_WITH | Erzwingt ein konsistentes Suffix für Dienstnamen. Sie können das spezifische Suffix mit .protolint.yaml konfigurieren. |
NEIN | _ | - | FELDNAMEN _ SCHLIESSEN PRÄPOSITIONEN AUS | Überprüft, ob alle Feldnamen Präpositionen enthalten (z. B. „für“, „während“, „um“). Sie können die spezifischen Präpositionen und ausgeschlossenen Schlüsselwörter mit .protolint.yaml konfigurieren. |
NEIN | _ | - | MESSAGE_NAMES_EXCLUDE_PREPOSITIONS | Überprüft, ob Nachrichtennamen keine Präpositionen enthalten (z. B. „Mit“, „Für“). Sie können die spezifischen Präpositionen und ausgeschlossenen Schlüsselwörter mit .protolint.yaml konfigurieren. |
NEIN | _ | - | RPC_NAMES_CASE | Überprüft, ob alle RPC-Namen der angegebenen Konvention entsprechen. Sie müssen die spezifische Konvention mit .protolint.yaml konfigurieren. |
NEIN | _ | - | MESSAGES_HAVE_COMMENT | Überprüft, ob alle Nachrichten einen Kommentar enthalten. Sie können dies mit .protolint.yaml so konfigurieren, dass Kommentare im Golang-Stil erzwungen werden. |
NEIN | _ | - | DIENSTE_HABEN_KOMMENTAR | Überprüft, ob alle Dienste einen Kommentar haben. Sie können die Erzwingung von Golang-Style-Kommentaren mit .protolint.yaml konfigurieren. |
NEIN | _ | - | RPCS_HAVE_COMMENT | Überprüft, ob alle RPS einen Kommentar haben. Sie können die Erzwingung von Kommentaren im Golang-Stil mit .protolint.yaml konfigurieren. |
NEIN | _ | - | FELDER_HABEN_KOMMENTARE | Überprüft, ob alle Felder einen Kommentar enthalten. Sie können die Erzwingung von Kommentaren im Golang-Stil mit .protolint.yaml konfigurieren. |
NEIN | _ | - | ENUMS_HAVE_COMMENT | Überprüft, ob alle Enumerationen einen Kommentar enthalten. Sie können die Erzwingung von Kommentaren im Golang-Stil mit .protolint.yaml konfigurieren. |
NEIN | _ | - | ENUM_FIELDS_HAVE_COMMENT | Überprüft, ob alle Enumerationsfelder einen Kommentar enthalten. Sie können die Erzwingung von Kommentaren im Golang-Stil mit .protolint.yaml konfigurieren. |
NEIN | _ | - | DATEI_HAT_KOMMENTAR | Überprüft, ob eine Datei mit einem Dokumentkommentar beginnt. |
NEIN | _ | - | SYNTAX_CONSISTENT | Überprüft, ob die Syntax einer angegebenen Version entspricht. Der Standardwert ist proto3. Sie können die Version mit .protolint.yaml konfigurieren. |
Ich empfehle, dass Sie all_default: true
in .protolint.yaml
hinzufügen, da alle oben genannten Linter automatisch aktiviert werden, sodass Sie bei jeder Aktualisierung von Protolint immer den maximalen Nutzen daraus ziehen können.
Hier sind einige Beispiele, die zeigen, dass ein guter Stil standardmäßig aktiviert ist. -
ist ein schlechter Stil, +
ist ein guter Stil:
ENUM_FIELD_NAMES_PREFIX
ENUM_FIELD_NAMES_UPPER_SNAKE_CASE
ENUM_FIELD_NAMES_ZERO_VALUE_END_WITH
ENUM_NAMES_UPPER_CAMEL_CASE
FIELD_NAMES_LOWER_SNAKE_CASE
IMPORTS_SORTED
MESSAGE_NAMES_UPPER_CAMEL_CASE
BEFEHL
PAKETNAME IN KLEINBUCHSTABEN
RPC_NAMES_UPPER_CAMEL_CASE
RPC_NAMES_UPPER_CAMEL_CASE
WIEDERHOLTE FELDNAMEN IM PLURAL
EINZUG
ZITAT_KONSISTENT
Erstellen Ihrer benutzerdefinierten Regeln
Protolint ist der steckbare Linter, sodass Sie frei benutzerdefinierte Lint-Regeln erstellen können.
Ein vollständiges Beispielprojekt (auch bekannt als Plugin) ist in diesem Repo im Verzeichnis _example/plugin enthalten.
Reporter
Protolint verfügt über mehrere integrierte Reporter (auch Formatierer genannt), um das Erscheinungsbild der Lint-Ergebnisse zu steuern.
Sie können einen Reporter mit dem Flag -reporter in der Befehlszeile angeben. Beispielsweise verwendet -reporter junit
den JUnit-Reporter.
Die integrierten Reporteroptionen sind:
- einfach (Standard)
- junit
- json
- Sarif
- Sonar (generisches Problemformat von SonarQube)
- Unix
- tsc (kompatibel zum TypeScript-Compiler)
Konfigurieren
Regeln in einer Protokollpufferdatei deaktivieren
Regeln können mit einem Kommentar in einer Protokollpufferdatei im folgenden Format deaktiviert werden. Die Regeln bleiben bis zum Ende der Datei deaktiviert oder bis der Linter einen entsprechenden Aktivierungskommentar findet:
Es ist auch möglich, einen Deaktivierungsbefehl zu ändern, indem :next oder :this angehängt wird, um den Befehl nur auf diese (aktuelle) bzw. die nächste Zeile anzuwenden.
Zum Beispiel:
Wenn Sie die Befehlszeilenoption -auto_disable
auf next
oder this
setzen, werden beim Erkennen von Problemen Deaktivierungsbefehle eingefügt.
Sie können die Option -fix
zusammen angeben. Die Regeln, die auto_disable unterstützen, unterdrücken die Verstöße, die eine Schemainkompatibilität verursachen, anstatt sie zu beheben.
Konfigurationsdatei
Protolint kann mit einer Konfigurationsdatei namens .protolint.yaml
betrieben werden.
Die Spezifikation der Konfigurationsdatei finden Sie unter _example/config/.protolint.yaml .
Protolint durchsucht standardmäßig automatisch das aktuelle Arbeitsverzeichnis nach der Konfigurationsdatei und die nachfolgenden übergeordneten Verzeichnisse bis hin zum Stammverzeichnis des Dateisystems. Mit dem Flag -config_dir_path
kann das angegebene Verzeichnis durchsucht werden. Mit dem Flag --config_path
kann auch die angegebene Datei durchsucht werden.
Beendigungscodes
Beim Lint-Testen von Dateien wird Protolint mit einem der folgenden Exitcodes beendet:
0
: Das Linting war erfolgreich und es liegen keine Linting-Fehler vor.1
: Das Linting war erfolgreich und es liegt mindestens ein Linting-Fehler vor.2
: Das Linting war aufgrund aller anderen Fehler, wie z. B. Analyse-, internen und Laufzeitfehlern, nicht erfolgreich.
Motivation
Seit dem 20.12.2018 gibt es ähnliche Protobuf-Linter.
Eines davon ist ein Plug-in für den Protocol Buffers-Compiler von Google.
- Wenn Sie die Dateien nur linten möchten, kann das Erstellen der Kompilierungsumgebung mühsam sein.
- Und das Kompilieren der Dateien nimmt im Allgemeinen viel mehr Zeit in Anspruch als das Parsen der Dateien.
„Other“ ist ein Befehlszeilentool, das auch Protocol Buffer-Dateien lintet.
- Obwohl es neben Lint noch viele andere Funktionen bietet, erscheint es für Benutzer, die nur den Linter möchten, umständlich.
- Die Lint-Regel neigt dazu, eigensinnig zu sein.
- Darüber hinaus stimmen die Regeln und der offizielle Styleguide nicht exakt überein. Es ist daher erforderlich, sowohl die Regeln als auch den Styleguide im Detail zu verstehen und die Regeln dann präzise zu kombinieren.
Andere Werkzeuge
Ich habe am 17.12.2019 einen Artikel geschrieben, in dem ich verschiedene Protocol Buffer Linters, einschließlich Protolint, verglichen habe.
- https://qiita.com/yoheimuta/items/da7678fcd046b93a2637
- HINWEIS: Dieser ist auf Japanisch geschrieben.
Abhängigkeiten
Entwicklung
Freigeben
Um den Release-Prozess zu optimieren und menschliche Fehler zu reduzieren, ist im Repository ein release.sh
-Skript enthalten. Dieses Skript automatisiert die Schritte zum Erstellen und Pushen eines neuen Release-Tags.
Anwendung
Führen Sie den folgenden Befehl aus, um eine neue Version zu erstellen:
Lizenz
Die MIT-Lizenz (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