Zum Inhalt springen

Eine .ccr-Regeldatei auf Syntax- und Referenzfehler prüfen

Eine einzelne .ccr-Regeldatei auf Syntaxfehler und unbekannte Property-/Methodenreferenzen prüfen und ihre Metadaten ausgeben.

codecharter validate <file> [--license <path>]

<file> ist der Pfad zu einer einzelnen .ccr-Datei. Der Befehl parst die Direktiven und die Query-Syntax der Datei und löst anschließend jede Property- und Methodenreferenz in der Query statisch gegen das DSL-Schema auf - auch über verkettete Zugriffe und Lambda-Parameter hinweg (z. B. .Where(m => m.DeclaringType.Boddy)) - und gibt die Regel-Metadaten aus, wenn beide Prüfungen erfolgreich sind. Eine unbekannte Property oder Methode, etwa ein Tippfehler wie t.CompletelyBogusProperty, wird jetzt schon hier gemeldet statt erst später bei analyze, test oder dry_run, inklusive „Did you mean"-Vorschlag bei einer nahen Übereinstimmung.

Die eine Stelle, die diese statische Prüfung bewusst ausspart, ist die Statement-Ebene der Syntax-Navigation (m.Syntax.Descendants.<NodeKind> und Ähnliches): Welche Kind-Slots ein Syntaxknoten hat, hängt von seiner Laufzeitart ab, die validate nicht statisch kennen kann - dieser Zugriff bleibt daher dynamisch typisiert und wird erst zur Laufzeit geprüft. Modellseitige Navigation neben einem Syntax-Zugriff (z. B. m.DeclaringType.Boddy neben m.Syntax...) wird weiterhin geprüft.

validate prüft nicht, wie sich die Regel auf echtem Code verhält; verwenden Sie dafür codecharter test, um eine Regel gegen ihre Hit/Miss-Spec-Fälle zu verifizieren.

Wie jeder CLI-Befehl benötigt validate eine gültige Lizenz. Geben Sie die Lizenzdatei mit --license <path> oder über die Umgebungsvariable CODECHARTER_LICENSE an; siehe Lizenzdatei.

Beispiel

codecharter validate .codecharter/rules/repository-naming.ccr

Ausgabe bei Erfolg:

Rule 'Repository class must end in Repository' parsed successfully
  Severity: Error
  Category: Naming
  Description: Repositories must have a 'Repository' suffix for discoverability

Fehlende Direktiven erhalten in den ausgegebenen Metadaten Standardwerte: ohne @name wird der Dateiname verwendet, ohne @severity gilt warn (nicht erkannte Severity-Werte werden ebenfalls als warn behandelt), und ohne @category gilt General.

Bei einem Fehler wird eine Meldung in dieser Form auf stderr ausgegeben:

Validation failed: Parse error: ...

Eine unbekannte Property sieht so aus:

Validation failed: No member 'LinesOfCod' on Type. Check the predicate catalog for valid properties. Did you mean 'LinesOfCode'?

Exit-Codes

  • 0: Die Datei wurde erfolgreich geparst.
  • 2: Die Datei konnte nicht geparst oder validiert werden; prüfen Sie stderr auf Validation failed:.
  • 6: Lizenzfehler (fehlend, abgelaufen oder für diese CLI-Version nicht gültig).

Empfohlene Verwendung

Als Pre-Commit-Hook für Regeldateien

#!/bin/sh
for file in $(git diff --cached --name-only --diff-filter=ACMR | grep '\.ccr$'); do
    if codecharter validate "$file" 2>&1 | grep -q 'Validation failed'; then
        echo "Invalid rule file: $file"
        exit 1
    fi
done

Der Hook prüft die Ausgabe auf Validation failed: statt auf den Exit-Code. So fangen Sie Syntaxfehler in .ccr-Dateien ab, bevor der CI-Lauf sie sieht.