Skip to content

feat(sdk): Plugins AOT- und Trimming-kompatibel machen #39

@kirkone

Description

@kirkone

Übersicht

Plugins AOT- und Trimming-kompatibel machen, damit sie in Zukunft in einem potenziellen AOT-Build verwendbar sind. Unabhängig davon verbessert Trimming-Kompatibilität die Code-Qualität und eliminiert versteckte Reflection-Abhängigkeiten.

Hinweis: Dies betrifft die Plugin-DLLs selbst, nicht den Plugin-Loader (der bleibt Reflection-basiert, siehe #40).

Aktueller Stand

Komponente AOT/Trim-Status Blocker
LoggerMessage ✅ Source Generator Kein Reflection
IConfiguration.Bind() ❌ Reflection #38 löst das
System.Text.Json ⚠️ Hat Source Gen Mode Noch nicht aktiviert
Scriban ⚠️ v7 hat AOT-Annotationen Runtime Template Compilation
NetVips ⚠️ P/Invoke Prinzipiell AOT-fähig
SSH.NET ⚠️ Pure .NET Viel internes Reflection, unklar
Plugin-Loader Assembly.LoadFrom() → Eigenes Thema (#40)

Was "Plugin ist trimmbar" bedeutet

Ein Plugin ist trimmbar wenn der Trimmer alle nicht erreichbaren Typen sicher entfernen kann, ohne dass zur Laufzeit Fehler auftreten. Dafür muss das Plugin:

  1. Kein Reflection für eigene Typen nutzen — kein Type.GetType(), kein Activator.CreateInstance()
  2. [DynamicallyAccessedMembers] Annotationen an den richtigen Stellen haben
  3. Source-Generated Config statt Reflection-basiertem IConfiguration.Bind() nutzen (→ feat(sdk): Source Generator für automatische Config-Registrierung #38)
  4. Trimming-Warnings frei sein (<IsTrimmable>true</IsTrimmable>)

Schritte

Phase 1: Grundlagen (nach #38)

  • <IsTrimmable>true</IsTrimmable> auf Sdk-Projekt setzen
  • Trimming-Warnings in allen Plugin-Projekten aktivieren (<EnableTrimAnalyzer>true</EnableTrimAnalyzer>)
  • Warnings analysieren und fixen
  • [DynamicallyAccessedMembers] Annotationen wo nötig

Phase 2: Dependencies prüfen

  • Scriban v7 AOT-Annotationen evaluieren — funktioniert Template-Rendering ohne Reflection?
  • NetVips P/Invoke — AOT-Kompatibilität verifizieren
  • SSH.NET — Trimming-Kompatibilität testen
  • System.Text.Json Source Generation aktivieren wo wir JSON serialisieren

Phase 3: CI-Integration

  • Trimming-Warnings als Errors in CI (zumindest für eigene Projekte)
  • Eventuell Trimming-Test: dotnet publish -p:PublishTrimmed=true als CI-Step

Abhängigkeiten

Abgrenzung

  • Der Plugin-Loader (Assembly.LoadFrom(), Reflection Discovery) ist NICHT Teil dieses Issues — der bleibt dynamisch
  • AOT-Publishing des gesamten CLI ist NICHT das Ziel hier — nur die Plugins selbst sollen trim-safe sein
  • Externe Plugin-Autoren profitieren automatisch wenn das Sdk trim-annotiert ist

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions