Skip to Content
Neue Version 12 verfügbar 🎉
LicensingBefehlszeileKI-freundlicher Modus

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|ndjson wählt das Format des Ausgabekanals
  • --quiet (Alias -q) unterdrückt das Logo-Banner und bricht bei interaktiven Eingabeaufforderungen sofort mit einem Fehler ab
  • --strict-exit schaltet 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:

WertBeschreibung
textStandard. Die bisherige, für Menschen lesbare Konsolenausgabe.
jsonEin 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.
ndjsonZeilengetrenntes 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.

ExitcodeKonstanteBedeutung
0successDer Befehl wurde ohne Fehler abgeschlossen.
10invalidArgumentsDie Befehlszeile konnte nicht ausgewertet werden oder enthielt einen ungültigen Wert (zum Beispiel eine unbekannte Option).
20inputNotFoundDie Assembly, die Lizenzdatei oder eine andere erforderliche Eingabedatei wurde nicht gefunden.
30processingFailureDie Lizenzverarbeitung ist fehlgeschlagen: die Erzeugung, die Aktualisierung oder eine Signatur, deren Prüfung fehlschlug.
40licensingFailureDie eigene Lizenz des Tools für Babel Licensing fehlt, ist ungültig oder abgelaufen.
50keyOrSigningFailureEine 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:

event
{ "schema": "lic.cli.v1", "kind": "event", "ts": "2026-09-03T06:31:54.1686900Z", "level": "info", "message": "License saved to 'MyApp.licenses'" }
FeldTypHinweise
tsZeichenfolge (ISO 8601, UTC)Zeitstempel, zu dem das Ereignis erzeugt wurde.
leveldebug | info | warning | errorSchweregrad.
codeZeichenfolgeDiagnosecode, nur vorhanden, wenn die Meldung einen hat.
messageZeichenfolgeFür Menschen lesbare Meldung.
dataObjektOptionale 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:

result (json)
{ "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:

result (json, failure)
{ "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:

result (ndjson)
{"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}
FeldTypHinweise
exitCodeGanzzahlNumerischer Exitcode, den der Prozess tatsächlich zurückgibt (bisherig oder strikt, je nach --strict-exit).
exitReasonZeichenfolgeStabiles Klassifizierungstoken. Gibt immer die semantische Klasse wieder, auch ohne --strict-exit.
elapsedMsGanzzahlTatsächlich verstrichene Gesamtdauer in Millisekunden.
warningsGanzzahlAnzahl der Ereignisse der Stufe warning.
errorsGanzzahlAnzahl der Ereignisse der Stufe error.
eventsArrayIm 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.

--help --format=json (excerpt)
{ "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..." } ] }
FeldBedeutung
name, aliasesDer Name der Option und ihre alternativen Schreibweisen, einschließlich der negierten Formen und der einbuchstabigen Aliase.
argsDer Platzhalter des Arguments, wie ihn die Aufrufsyntax zeigt, oder leer bei einem Schalter.
argRequired, argOptionalOb die Option ein obligatorisches oder ein optionales Argument erwartet.
negatableOb die Option das Präfix no akzeptiert.
containerscalar für einen einzelnen Wert, array für eine wiederholbare Option, hash für Paare der Form key=value.
typestring oder integer.
groupDer Abschnitt der Hilfeausgabe, zu dem die Option gehört.
detailsDie 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:

--version --format=json
{ "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.json

Dieselbe 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 --format ist text. Die bisherige Textausgabe, die Exitcodes und das Verhalten bleiben unverändert, wenn kein neues Flag angegeben wird.
  • Ohne --strict-exit gibt der Prozess weiterhin 0 bei Erfolg und 1 bei jedem Fehlschlag zurück. Vorhandene Prüfungen, die nach $? verzweigen, funktionieren weiter.
  • --quiet ist unabhängig und lässt sich verwenden, ohne die strukturierte Ausgabe einzuschalten.
Last updated on