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 aufValidation 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.