Sub-Workflows & Bausteine
Was ist ein Baustein?
In Flower ist jeder Workflow eine YAML-Datei mit der Endung .flower. Das Schöne daran: Es gibt keinen technischen Unterschied zwischen einem fertigen Workflow und einem wiederverwendbaren Baustein. Beide haben denselben Aufbau. Ob eine Datei als eigenständiger Workflow läuft oder als Helfer für andere dient, hängt nur davon ab, welche Abschnitte sie benutzt.
Ein eigenständiger Top-Level-Workflow hat einen trigger: (was ihn auslöst) und einen ablauf: (die Schritte). Ein wiederverwendbarer Baustein hat stattdessen inputs: (die Werte, die er von außen entgegennimmt), einen ablauf: und outputs: zusammen mit return: (die Werte, die er zurückgibt). So entsteht ganz organisch eine Bibliothek aus kleinen, gut benannten Helfern, die Sie immer wieder einsetzen können — anstatt dieselben Schritte in jedem Workflow neu zu bauen.
Der Vorteil: Eine wiederkehrende Aufgabe wie PDF in Excel übertragen oder eine Freigabe anfordern schreiben Sie einmal als Baustein und rufen sie überall auf. Ändert sich die Aufgabe, passen Sie nur den einen Baustein an, und alle Workflows, die ihn nutzen, profitieren sofort.
- Top-Level-Workflow: benutzt trigger: + ablauf:
- Wiederverwendbarer Baustein: benutzt inputs: + ablauf: + outputs: + return:
- Beide werden als .flower-Datei gespeichert — die Endung sagt nichts über die Rolle, nur über das Format.
- name: und beschreibung: sind optionale Metadaten, die der Editor in Listen und im Baum anzeigt.
Einen Baustein erstellen
Ein Baustein nimmt oben unter inputs: seine Eingabe-Parameter entgegen. Hier listen Sie nur die Namen — keine Typen, keine Pflicht-Markierung. Optional dürfen Sie eine beschreibung: und einen standard: (Standardwert) angeben. Der Standardwert greift nur dann, wenn der Aufrufer keinen eigenen Wert mitliefert.
Im ablauf: macht der Baustein seine eigentliche Arbeit, genau wie jeder andere Workflow. Am Ende deklarieren Sie unter outputs: die Namen der Rückgabewerte und befüllen sie über return: mit den Variablen aus dem Ablauf. Nur was hier zurückgegeben wird, ist für den aufrufenden Workflow sichtbar — alles andere bleibt im Baustein gekapselt.
Diese strikte Kapselung ist Absicht: Innerhalb einer Datei sind alle Variablen flach sichtbar, aber zwischen Dateien fließen Daten ausschließlich über die deklarierten inputs: und outputs:. So kann ein Baustein nie versehentlich eine Variable des Aufrufers überschreiben.
- inputs: listet nur Namen, optional mit beschreibung: und standard:.
- Ein weggelassener Input ist einfach nicht gesetzt — das erste Modul, das ihn braucht, meldet sich mit klarer Fehlermeldung.
- outputs: deklariert die Namen der Rückgabewerte.
- return: befüllt diese Outputs am Ende des Ablaufs.
- Was nicht in outputs:/return: steht, bleibt nach außen unsichtbar.
Baustein: alter-zaehler-erhoehen.flower
Ein wiederverwendbarer Baustein, der einen Wert in eine Excel-Tabelle schreibt und den vorherigen Wert zurückgibt.
Namen der Werte, die der Baustein von außen entgegennimmt — frei wählbar.
Namen der Werte, die der Baustein nach außen sichtbar macht.
Belegt jede Ausgabe mit einer Variable aus dem Ablauf.
name: alter-zaehler-erhoehen
beschreibung: Setzt eine Excel-Zelle und gibt den vorherigen Wert zurück.
inputs:
excel_pfad:
zeile:
neuer_wert:
ablauf:
- office.excel:
datei: excel_pfad
aktionen:
- zelle-setzen:
zeile: zeile
spalte: "B"
wert: neuer_wert
ergebnis: vorher
- speichern
outputs:
alter_wert:
beschreibung: "Wert, der vorher in der Zelle stand"
return:
alter_wert: vorher.alter_wertEinen Baustein aufrufen
Einen Baustein binden Sie mit dem Schritt aufruf: in einen anderen Workflow ein. Sie geben den Datei-Namen des Bausteins an und unter inputs: die Werte, die er bekommen soll — links steht der Input-Name des Bausteins, rechts der Wert oder die Variable aus Ihrem Workflow.
Damit Sie an die Rückgabe kommen, geben Sie mit ergebnis: einen Namen an, unter dem die Outputs des Bausteins abgelegt werden. Danach erreichen Sie jeden Rückgabewert über diesen Namen mit Punkt-Zugriff, zum Beispiel ergebnis.alter_wert. Im Editor wird ein aufruf: als Sub-Prozess dargestellt — ein Rechteck mit doppelter Linie, das Sie anklicken können, um in das Sub-Diagramm zu springen.
Beim Aufruf gelten dieselben Variablen-Regeln wie überall: Werte ohne Anführungszeichen sind Variablen, Werte in Anführungszeichen sind Text-Literale. Datenfluss läuft nur über die deklarierten inputs: hinein und über das ergebnis: wieder heraus.
- aufruf: nennt den Datei-Namen des Bausteins.
- inputs: verdrahtet Baustein-Eingaben mit Ihren Werten (links Input-Name, rechts Wert/Variable).
- ergebnis: legt einen Namen fest, unter dem die Rückgaben verfügbar werden.
- Zugriff danach über ergebnis.<output-name> mit Punkt-Notation.
Workflow ruft den Baustein auf
Ein Workflow übergibt drei Werte an den Baustein und liest danach dessen Rückgabe aus.
trigger:
- typ: neue-datei
pfad: "C:\\Eingang"
ablauf:
- aufruf: "alter-zaehler-erhoehen.flower"
inputs:
excel_pfad: "C:\\Daten\\auftraege.xlsx"
zeile: 5
neuer_wert: datei.name
ergebnis: result
- office.outlook.mail:
an: "buchhaltung@firma.de"
betreff: "Zelle aktualisiert"
text: result.alter_wert
aktionen:
- sendenWo Flower den Baustein sucht (Pfadauflösung)
Wenn Sie bei aufruf: nur einen Datei-Namen angeben, muss Flower wissen, welche Datei gemeint ist. Die Suche läuft immer in derselben festen Reihenfolge ab. Zuerst sucht Flower relativ zum aktuellen Workflow — also im selben Ordner und in einem Unterordner lib/. Findet sich dort nichts, geht Flower die globale Quellen-Prioritäts-Liste durch.
Diese Prioritäts-Liste sorgt dafür, dass bei gleichem Datei-Namen die höher priorisierte Quelle gewinnt. So kann ein Nutzer einen firmenweit ausgerollten Baustein durch eine eigene Version überschreiben, ohne das Original anzutasten. Der Editor zeigt zu jedem Workflow die effektive Quelle als Markierung an.
Praktisch heißt das: Halten Sie Bausteine, die nur zu einem bestimmten Workflow gehören, am besten direkt daneben oder im lib/-Ordner. Allgemein nützliche Helfer legen Sie in eine der globalen Workflow-Quellen, damit alle Workflows sie finden.
- 1. Relativ zum aktuellen Workflow (gleicher Ordner oder lib/-Unterordner).
- 2. Globale Quellen-Prioritäts-Liste: Nutzer > Zusätzliche Pfade > Geteilt (Netz) > Maschine > Eingebaut.
- Bei Namenskonflikt gewinnt die höhere Priorität — eine eigene Kopie kann eine ausgerollte Version überschreiben.
- Der Editor zeigt die effektive Quelle pro Workflow als Tag an.
Schutz gegen Endlos-Schleifen: Kreis-Aufruf & maximale Tiefe
Bausteine dürfen selbst wieder Bausteine aufrufen — beliebig tief verschachtelt. Damit dabei nichts entgleist, hat Flower zwei eingebaute Sicherungen.
Die erste ist die Kreis-Aufruf-Erkennung. Ruft a.flower irgendwann (auch über Umwege) wieder a.flower auf, entstünde eine Endlosschleife. Flower führt deshalb während des Laufs einen Aufruf-Stack mit den vollständigen Datei-Pfaden aller gerade aktiven Workflows. Vor jedem aufruf: prüft die Engine, ob das Ziel schon im Stack steht. Ist das der Fall, bricht der Lauf sauber mit dem Fehler kreis-aufruf ab und zeigt die komplette Aufruf-Kette. Schon im Editor erkennt die Live-Prüfung solche Kreise und markiert sie gelb, bevor Sie den Workflow überhaupt starten.
Die zweite Sicherung ist die maximale Aufruf-Tiefe. Selbst ohne Kreis können sehr viele verschachtelte Aufrufe unbeabsichtigt entstehen. Standardmäßig erlaubt Flower 32 Ebenen; dieser Wert ist in der Admin- oder Nutzer-Konfiguration über workflow.maximale-aufruf-tiefe einstellbar. Wird die Grenze überschritten, stoppt der Lauf mit dem Fehler aufruf-tiefe-ueberschritten.
Ein nicht gefangener Fehler aus einem aufgerufenen Baustein wird übrigens an den aufrufenden Workflow weitergereicht — dort können Sie ihn mit einem versuche:/bei_fehler:-Block abfangen und gezielt darauf reagieren.
- Kreis-Aufruf-Erkennung: Aufruf-Stack mit absoluten Pfaden; Wiederholung bricht mit fehler.typ: kreis-aufruf ab (inkl. Stack-Spur).
- Der Editor markiert Kreis-Aufrufe schon vor dem Lauf als gelben Hinweis.
- Maximale Aufruf-Tiefe: Default 32 Ebenen, einstellbar über workflow.maximale-aufruf-tiefe.
- Überschreitung führt zu fehler.typ: aufruf-tiefe-ueberschritten.
- Fehler aus einem Baustein steigen zum Aufrufer hoch und sind dort mit versuche:/bei_fehler: fangbar.
Aufruf abgesichert mit versuche/bei_fehler
Schlägt der Baustein fehl (z.B. Kreis-Aufruf oder zu tiefe Schachtelung), fängt der Aufrufer den Fehler ab und reagiert.
JA dann
NEIN sonst
ablauf:
- versuche:
- aufruf: "freigabe-anfordern.flower"
inputs:
vorgang: datei.name
ergebnis: freigabe
bei_fehler:
- office.outlook.mail:
an: "admin@firma.de"
betreff: "Baustein-Fehler"
text: fehler.meldung
aktionen:
- senden
- wenn: freigabe.status
ist: "genehmigt"
dann:
- office.outlook.mail:
an: "team@firma.de"
betreff: "Freigabe erteilt"
aktionen:
- senden
sonst:
- office.outlook.mail:
an: "team@firma.de"
betreff: "Freigabe abgelehnt"
aktionen:
- sendenBausteine weitergeben (Bündel-Export)
Sobald ein Workflow Bausteine über aufruf: verwendet, hängen mehrere .flower-Dateien zusammen. Damit beim Weitergeben nichts fehlt, exportiert Flower solche Workflows als Bündel — ein ZIP-Archiv, das den Hauptworkflow und alle aufgerufenen Bausteine zusammen enthält.
Beim Import prüft der Editor, ob alle benötigten Module in passender Version vorhanden sind, und weist auf nachzuinstallierende Pakete hin. Die Sub-Workflows bleiben im Bündel als eigene Dateien erhalten — passend zum Grundprinzip von Flower, dass Komposition durch Schachtelung mehrerer YAML-Dateien entsteht.
- Workflows mit aufruf: werden als ZIP-Bündel (.flowerbundle) weitergegeben.
- Das Bündel enthält Hauptworkflow und alle aufgerufenen Bausteine.
- Beim Import prüft der Editor benötigte Module und Versionen und meldet Lücken.
- Sub-Workflows bleiben als separate Dateien erhalten.