KI-freundlicher CLI-Modus Server
Ab Babel Licensing 11.8 kann die Befehlszeile lic einen strukturierten, maschinenlesbaren Ausgabestrom ausgeben, der sich für CI-Pipelines, Bestellsysteme und KI-Agenten eignet. Das entspricht dem Modus, den der Obfuscator mit Version 11.7 erhalten hat.
Die standardmäßige Textausgabe von lic ist unverändert und bleibt vollständig abwärtskompatibel: Vorhandene Skripte müssen nicht angepasst werden.
Der KI-freundliche Modus wird über drei globale Flags eingeschaltet:
--format=text|json|ndjsonwählt das Format des Ausgabekanals--quiet(Alias-q) unterdrückt das Logo-Banner und bricht bei interaktiven Eingabeaufforderungen sofort mit einem Fehler ab--strict-exitschaltet semantische Exitcodes ein
Wenn --format=json oder --format=ndjson gewählt ist, trägt stdout den strukturierten Datenstrom, und die für Menschen lesbaren Meldungen werden nach stderr geleitet, sodass sich die beiden Kanäle nie vermischen.
--format ist auch die Option, die das Ausgabeformat der Lizenz wählt (xml, serial, base32, ascii). Die beiden Wertemengen überschneiden sich nicht, daher können beide Bedeutungen in einer Befehlszeile stehen: lic MyApp.dll --format base32 --format json.
Flags
—format <format>
Wählt das Ausgabeformat, das auf stdout verwendet wird. Zulässige Werte:
| Wert | Beschreibung |
|---|---|
text | Standard. Die bisherige, für Menschen lesbare Konsolenausgabe. |
json | Ein einzelnes, gepuffertes JSON-Dokument, das geschrieben wird, wenn der Lauf abgeschlossen ist (oder bei --help / --version). Am besten geeignet, wenn stdout in eine Datei umgeleitet oder an einen JSON-Verbraucher weitergereicht wird. |
ndjson | Zeilengetrenntes JSON. Ein Ereignis pro Zeile, das ausgegeben wird, sobald es entsteht. Am besten geeignet für Streaming-Verbraucher, Protokollsammler und laufende Agenten. |
lic MyApp.dll --keyfile keys.pem --sign --expiredate 365 --format json > result.json
lic MyApp.dll --keyfile keys.pem --sign --format ndjson | jq -c 'select(.level=="error")'Mit json oder ndjson wird das Logo-Banner unabhängig von --logo unterdrückt, damit schon das erste Byte auf stdout gültiges JSON ist.
—quiet (-q)
Unterdrückt das Copyright-Banner und jede interaktive Eingabeaufforderung. Die einzige Eingabeaufforderung von lic ist die nach dem Passwort einer PFX-Schlüsseldatei: Mit --quiet führt ein fehlendes --keypwd zu einem ausdrücklichen Fehler, statt auf eine Eingabe zu warten. Dadurch ist das Flag sicher für unbeaufsichtigte Läufe auf CI-Runnern, in Containern und durch Agenten.
lic MyApp.dll --quiet --keyfile signing.pfx --keypwd "$KEY_PWD" --sign--quiet ist unabhängig von --format: Es lässt sich mit der Ausgabe text kombinieren, um für Menschen lesbare Protokolle ohne das Banner zu erhalten.
—strict-exit
Schaltet für den Prozess semantische Exitcodes ein. Ohne dieses Flag behält lic die bisherige Vereinbarung bei, nach der 0 Erfolg und 1 jeden Fehlschlag bedeutet.
| Exitcode | Konstante | Bedeutung |
|---|---|---|
0 | success | Der Befehl wurde ohne Fehler abgeschlossen. |
10 | invalidArguments | Die Befehlszeile konnte nicht ausgewertet werden oder enthielt einen ungültigen Wert (zum Beispiel eine unbekannte Option). |
20 | inputNotFound | Die Assembly, die Lizenzdatei oder eine andere erforderliche Eingabedatei wurde nicht gefunden. |
30 | processingFailure | Die Lizenzverarbeitung ist fehlgeschlagen: die Erzeugung, die Aktualisierung oder eine Signatur, deren Prüfung fehlschlug. |
40 | licensingFailure | Die eigene Lizenz des Tools für Babel Licensing fehlt, ist ungültig oder abgelaufen. |
50 | keyOrSigningFailure | Eine Schlüsseldatei oder ein Schlüsselcontainer konnte nicht geladen werden, oder eine kryptografische Operation ist fehlgeschlagen. |
Die Zahlen sind dieselben wie in der Tabelle zu --strict-exit des Obfuscators. Ein Aufrufer kann daher babel und lic mit einer einzigen Exitcode-Tabelle steuern. Der einzige Unterschied: Der Code 30 bedeutet hier die Lizenzverarbeitung und dort die Verschleierung. Die Klassifizierung erscheint außerdem als exitReason im JSON-Ergebnis, auch wenn --strict-exit nicht aktiv ist.
lic MyApp.licenses --verify --keyfile keys.pem --strict-exit --quiet
echo "exit=$?"Schema: lic.cli.v1
Alle strukturierten Nutzdaten tragen "schema": "lic.cli.v1" und ein kind, das angibt, was das Dokument ist: event, result, help oder version. Das Schema spiegelt das Schema babel.cli.v1 des Obfuscators, wird aber getrennt versioniert, weil die beiden Tools unterschiedliche Optionen bieten. Innerhalb einer Hauptversion des Schemas sind additive Änderungen zulässig. Bei inkompatiblen Änderungen erhält das Schema einen neuen Namen.
Ereignisdatensatz
Jede Meldung, die während eines Laufs ausgegeben wird, wird auf ein Ereignis abgebildet:
{
"schema": "lic.cli.v1",
"kind": "event",
"ts": "2026-09-03T06:31:54.1686900Z",
"level": "info",
"message": "License saved to 'MyApp.licenses'"
}| Feld | Typ | Hinweise |
|---|---|---|
ts | Zeichenfolge (ISO 8601, UTC) | Zeitstempel, zu dem das Ereignis erzeugt wurde. |
level | debug | info | warning | error | Schweregrad. |
code | Zeichenfolge | Diagnosecode, nur vorhanden, wenn die Meldung einen hat. |
message | Zeichenfolge | Für Menschen lesbare Meldung. |
data | Objekt | Optionale strukturierte Nutzdaten, nur vorhanden, wenn sie angehängt sind. |
Ergebnisumschlag
—format=json
Wenn der Lauf endet, wird ein einzelnes JSON-Objekt nach stdout geschrieben. Es enthält die Zusammenfassung des Laufs und alle Ereignisse, die während des Laufs gepuffert wurden:
{
"schema": "lic.cli.v1",
"kind": "result",
"exitCode": 0,
"exitReason": "success",
"elapsedMs": 133,
"warnings": 0,
"errors": 0,
"events": [
{ "schema": "lic.cli.v1", "kind": "event", "ts": "2026-09-03T06:31:54.1686900Z", "level": "info", "message": "License saved to 'MyApp.licenses'" }
]
}Ein fehlgeschlagener Lauf meldet die Fehlerklasse in exitReason und den Fehler unter den Ereignissen. Hier war die Eingabe-Assembly nicht vorhanden:
{
"schema": "lic.cli.v1",
"kind": "result",
"exitCode": 20,
"exitReason": "inputNotFound",
"elapsedMs": 34,
"warnings": 0,
"errors": 1,
"events": [
{ "schema": "lic.cli.v1", "kind": "event", "ts": "2026-09-03T06:30:27.4366510Z", "level": "error", "message": "Error: The specified file '/build/missing.dll' was not found." }
]
}—format=ndjson
Jedes Ereignis wird in einer eigenen Zeile ausgegeben, sobald es entsteht. Nach dem letzten Ereignis folgt eine abschließende Ergebniszeile ohne das Array events, da die Ereignisse bereits übertragen wurden:
{"schema":"lic.cli.v1","kind":"event","ts":"2026-09-03T06:31:54.3357790Z","level":"info","message":"License saved to 'MyApp.licenses'"}
{"schema":"lic.cli.v1","kind":"result","exitCode":0,"exitReason":"success","elapsedMs":141,"warnings":0,"errors":0}| Feld | Typ | Hinweise |
|---|---|---|
exitCode | Ganzzahl | Numerischer Exitcode, den der Prozess tatsächlich zurückgibt (bisherig oder strikt, je nach --strict-exit). |
exitReason | Zeichenfolge | Stabiles Klassifizierungstoken. Gibt immer die semantische Klasse wieder, auch ohne --strict-exit. |
elapsedMs | Ganzzahl | Tatsächlich verstrichene Gesamtdauer in Millisekunden. |
warnings | Ganzzahl | Anzahl der Ereignisse der Stufe warning. |
errors | Ganzzahl | Anzahl der Ereignisse der Stufe error. |
events | Array | Im Modus json vorhanden, in ndjson weggelassen. |
Maschinenlesbares —help
lic --help --format=json gibt eine vollständige Beschreibung jeder öffentlichen Option aus. Sie eignet sich für Tools, die die Oberfläche der CLI auswerten müssen: Shell-Vervollständigung, KI-Agenten, Dokumentationsgeneratoren.
{
"schema": "lic.cli.v1",
"kind": "help",
"version": "12.0.0.0",
"usage": "lic.exe <assembly|licensefile> [<other assemblies>...] [options]",
"options": [
{
"name": "trial",
"aliases": [],
"description": "Add or update trial license restriction",
"args": "<key=value>",
"argRequired": true,
"argOptional": false,
"negatable": false,
"incremental": false,
"container": "hash",
"type": "string",
"group": "- License Restrictions -",
"details": "Set trial restriction properties entering key-value pairs:\n\nid=<id> Restriction id\nexpire=<date> Set expiration date\ndays=<n> Set number of trial days\n..."
}
]
}| Feld | Bedeutung |
|---|---|
name, aliases | Der Name der Option und ihre alternativen Schreibweisen, einschließlich der negierten Formen und der einbuchstabigen Aliase. |
args | Der Platzhalter des Arguments, wie ihn die Aufrufsyntax zeigt, oder leer bei einem Schalter. |
argRequired, argOptional | Ob die Option ein obligatorisches oder ein optionales Argument erwartet. |
negatable | Ob die Option das Präfix no akzeptiert. |
container | scalar für einen einzelnen Wert, array für eine wiederholbare Option, hash für Paare der Form key=value. |
type | string oder integer. |
group | Der Abschnitt der Hilfeausgabe, zu dem die Option gehört. |
details | Die ausführliche Beschreibung, derselbe Text, den lic --help <option> ausgibt. |
Auch eine eingegrenzte Form wird unterstützt: lic --help trial --format=json gibt denselben Umschlag aus, der aber nur die Option trial enthält. Verborgene und interne Optionen werden nie zurückgegeben.
Maschinenlesbares —version
lic --version --format=json gibt Informationen zu Produkt, Version, Laufzeit und Plattform aus:
{
"schema": "lic.cli.v1",
"kind": "version",
"product": "Babel Licensing",
"version": "12.0.0.0",
"fileVersion": "12.0.0.1",
"runtime": ".NET 10.0.0",
"platform": "osx-arm64"
}Das Feld platform verwendet unter .NET 5 und höher den Laufzeitbezeichner (RID) von .NET und auf älteren Zielen eine künstlich gebildete Zeichenfolge der Form <os>-<arch>.
lic von einem Agenten aus steuern
Ein Agent, der lic noch nie gesehen hat, kann das Tool allein anhand der JSON-Hilfe bedienen: das Schema der Optionen lesen, die Befehlszeile aus den Angaben args und container aufbauen, mit --format json --quiet --strict-exit ausführen und nach exitReason verzweigen. Ein typischer Ablauf zum Ausstellen einer Lizenz sieht so aus:
lic --help --format json > lic-options.json
lic MyApp.dll --keyfile keys.pem --sign --licensee name="Contoso" --expiredate 365 --output MyApp.licenses --format json --quiet --strict-exit > result.json
jq -r '.exitReason' result.jsonDieselbe Vereinbarung, dieselben Exitcodes und dieselben Flag-Namen gelten für die Befehlszeile des Obfuscators, beschrieben unter KI-freundlicher Modus im Handbuch des Obfuscators. Eine Integration deckt somit beide Tools ab.
Abwärtskompatibilität
- Der Standardwert von
--formatisttext. Die bisherige Textausgabe, die Exitcodes und das Verhalten bleiben unverändert, wenn kein neues Flag angegeben wird. - Ohne
--strict-exitgibt der Prozess weiterhin0bei Erfolg und1bei jedem Fehlschlag zurück. Vorhandene Prüfungen, die nach$?verzweigen, funktionieren weiter. --quietist unabhängig und lässt sich verwenden, ohne die strukturierte Ausgabe einzuschalten.