Was soll denn dieses Buch?

Dieses Buch sammelt verschieden Ideen, Aspekte und Themen resultierend aus meiner täglichen Arbeit im Büro und Gedanken von zu Hause. Dieses Buch enthält natürlich keine konkreten Interna meines Arbeitgebers oder identifizierbare Anekdoten.

Fokussiert wird sich hier auf das Systems Engineering, die Modellierung von Elemeenten, Schnittstellen und Eigenschaften komplexer Systeme. Zerlegung ist die Kunst. Hierbei betrachten wir auch die großen Standards wie UML, SysML and MOF. Weiterhin gibt es hier Anforderungen, Architektur, Aufgaben, Projektmanagement und anderer bekloppeter Dinger.

Das komplette Buch ist zur besseren Verständlichkeit in deutsch geschrieben. Erreiche ich nicht das weltweite Publikum besser? Darüber habe ich lange nachgedacht, aber mich aus folgenden Gründen doch für die deutsche Sprache entschieden:

  • Ich schreibe eleganter und effizienter

  • Die Erläuterungen sind plastischer und besser verständlich

  • Es gibt ausreichend gute Übersetzungsmaschinen

Die Quelle des Buchs ist verfügbar unter The source of the book is available in Github und Pull Requests sind immer willkommen.

Aber nun…​ lass uns einfach starten!

Gute Tools

Asciidoctor

https://asciidoctor.org/

Ein Konvertierungstool um aus .adoc-Dateien ein Html zu erzeugen. Auch das Geschriebene, welches du gerade liest, ist ein .adoc-Dokument. In Kombination mit Jenkins ein einfach gutes Tool.

Jenkins

https://www.jenkins.io/

Mittlerweile das Standard-Tool der automatisierten Ausführung von Skripten, wie zum Beispiel Build-Skripte, Test-Ausführungs-Skripte oder Konvertierungs-Skripte.

Visual Studio Code

https://code.visualstudio.com/

Ein sehr populärer Editor zum Bearbeiten von Code-, Markup und Daten-Dateien welcher unter allen großen Betriebssystemen läuft. Nutze ich täglich, wenn ich nicht Rider oder Visual Studio für C# nutze.

Visual Studio

https://visualstudio.microsoft.com/de/

Das Tool für Windows-Entwicklung, allerdings für C# nutze ich persönlich den Rider.

JetBrains Rider

https://www.jetbrains.com/de-de/rider/

Ein platform-übergreifendes Tool zur C#/.Net Entwicklung unter Windows und Linux. Mein persönliches Entwicklungstool.

Kostet ein wenig Geld, aber ist in meinen Augen das Abo wert.

DotNet Benchmark

https://github.com/dotnet/BenchmarkDotNet

Gehört mit NUnit zu einer der Standard-Tools für die Bestimmung der Laufzeit von Methoden. Das Tool kümmert sich automatisch um die Analyse des Overheads und der notwendigen Wiederholraten um eine gewisse Konfidenz zu erreichen. Bevor man mit "StopWatch" sein eigenes Benchmarking aufbaut, empfehle ich eine Prüfung dieser Bibliothek.

SmartGit

https://www.syntevo.com/smartgit/

Aktuell mein Lieblings-Git-Tool. Sieht nicht hypig aus, funktioniert sehr zuverlässig und besitzt eine gute grafische Darstellung der Revisions-Logs. Insgesamt auch, wie Git halt so ist, sehr schnell.

Alkoholfreie Bier

Anbei ein Rating verschiedener alkoholfreier Biere…​ Welche mag ich, welche mag ich nicht…​

Mönchshof - Original Naturtrüb’s Alkoholfrei

Getrunken habe ich es gut gekühlt. 6/10 Punkte

Gibt es in einer 0,5er Ploppflasche. Den Plopp-Test hat das Bier gut überstanden, es ploppt. Ausreichen Kohlensäure, schmeckt ein wenig dünn und verstopft nicht den Geschmack…​ Der Alkohol fehlt. Vom Geschmack her ist das Bier bierig, schmeckt beim Abgang nur leicht süßlich und eine Malznote findet sich, bei herbigem Grundgeschmack. Nach dem Genuss einer vollen Flasche habe ich spontan keine Lust auf ein zweites Bier.

Kloster Andechs Alkoholfrei

Ein Fest! 8/10 Punkte

Bereits der zweite Kasten am Stück gekauft und schmeckt nach täglichem Genuss. Wunderbar, wunderbar, wunderbar…​ Ein Fest…​ Schmeckt herb und der 'typisch' alkoholfrei-süßliche Geschmack ist mit einer feinen Noten schmeckbar, aber prägt nicht den Gesamtgeschmack, genau richtig. Kohlensäure ist mir ein Ticken zuviel, aber das lässt sich mit der entsprechenden Einschenk-Technik kompensieren. Kostet einen Euro mehr pro Kasten, aber uneingeschränkt empfehlbar.

System Engineering

Objekte

Lass uns mit den Objekten starten. In diesen Kapitel lernen wir etwas über die Schwierigkeite Dinge zu Objekten zu machen und zwar in einer Art und Weise, dass die beabsichtigte Aussage über das Objekt auch deutlich kommunizierbar ist.

Fragt man 10 verschiedene Persoenen über die Definition eines konkreten Objektes, kann man, vereinfacht gesagt, 10 verschiedene Antworten erhalten, die sich teilweise überlappen, aber auch teilweise völlig widersprechen.

Wir werden hier auch eine angemessene Definition des Terminus "Objekt" reden. Aber bevor wir das tun sollten wir darüber nachdenken, ob es überhaupt Sinn ergibt, eine Definition für das "Objekt" suchen. Wäre das Leben nicht schön, wenn wir einfach die Nicht-Definition akzeptieren und jeden mit seine eigenen Mindset denken, reden und handeln lassen.

Ja, das Leben ist schön…​ je unkonkreter, des besser…​ allerdings fangen die Schwierigkeiten an, wenn wir mit Menschen zusammenarbeiten. Für eine gute Zusammenarbeit ist es wichtig ein Objekt beschreiben zu können und man versteht, warum man ein Objekt in einer Art und Weise so beschreibt, wie man es tut und wie man es am Besten beschreiben soll und warum es für eine sachliche Diskusssion wichtig ist, ein Objekt sauber zu beschreiben und abzugrenzen.

Einige Dinge sind einfach…​ Wie ein Fahrzeug, aber selbst ein Fahrzeug kann in völlig unterschiedlichen Formen auftreten. Ist ein Auto ein Fahrzeug? Ist ein Fahrrad ein Fahrzeug oder ist ein Inline-Skater ein Fahrzeug? Oder reden wir über ein 'Eis'. Ist eine Eis zum Schlecken oder Gletscher-Eis genannt?

Was werden wir in unserem fachlichen Leben alles beschreiben wollen? Gibt es überhaupt eine Unschärfe zum privaten Leben? Während man im privaten Leben gerne mit der Ungenauigkeit auskommt und dies auch den Reiz des Zwischenmenschlichen ausmachen kann, führen Ungenauigkeiten spätestens bei der Auslieferung zu Konflikten…​ Dann ist es nämlich nicht süß, dass der andere komplett daneben lag, sondern für ein Projekt und damit dem schnöden Mammon gegebenenfalls fatal!

Zurück…​ was wollen wir eigentlich beschreiben?

  • Dinge und Sachen…​ klar!

  • Menschen, Tiere, Pflanzen…​ Würde schon sagen. Wenn man sagt, dass eine Sache einem Menschen gehört, muss klar sein, was ein Mensch ist und welche Eigenschaften er gegebenenfalls hat, da das Alter darlegt, ob dieser Mensch dies überhaupt besitzen darf.

  • Geometrische Figuren, Flächen, Volumen…​ Hört sich erstmal abstrakt an, aber das Volumen ist auch etwas, was man beschreiben muss. Oder ist es mehr eine Eigenschaft? Dazu später, aber spätestens wenn man ein Grundstück definiert, kommt man um die flächige Eigenschaft nicht drum herum.

  • Emotionen, Liebe und Gefühle…​ Wäre schön…​ Aber zu welchem Zweck im fachlichen Leben? In der Entertainmentbranche wäre es wahrscheinlich sinnig, wenn man die Wirkung eines Films messen und erfassen können

  • Handlungen, Taten…​ Nun wird es wirklich abstrakt, aber in meinen Augen ganz wichtig. Einer handelnden Person im Auftrag ist es je nach Arbeitsmodell sehr wichtig, was zu handeln ist.

  • Wetter, Schneefall, Sonnenstand…​ Ok, an Beispielen kommen wir nicht wirklich weiter.

  • …​ Es gibt hier noch ganz viele Dinge.

Wikipedia: Objekt

Nutzen wir mal Wikipedia…​ Objekt hilft eigentlich gar nicht. Hier fangen wir maximal die ersten zwei Punkte der obigen Liste, die wir beschreiben wollen.

Das Ding an sich

Hier haben wir eine Definition: Ding an sich - OK, die Definition ist so "hübsch", dass sie anstrengend ist…​ gehen wir mal weiter.

Res

Suchen wir was Anderes: Res. Gefällt mir irgendwie, holen wir das für uns Relevante heraus:

  • Eine Sache kann körperlich oder unkörperlich sein

  • Eine Sache kann beschrieben werden

  • Der Name einer Sache ist zweitrangig zu der Sache selbst

Damit kann man schon ein wenig anfangen, aber reicht mir noch nicht.

Die Sache im rechtlichen Sinne

Man denkt immer, dass im Recht viele Dinge sauber definiert sind…​ Aber das BGB ist in meinen Augen eine Besonderheit, da man hier in vielen Dingen vom gesunden Menschenverstand ausgehent. Wie ist die Sache hier definiert:

§90 BGB sagt: "Sachen im Sinne des Gesetzen sind nur körperliche Gegenstände"

Macht mich nicht glücklich, denn ich möchte ja auch Personen, nichtkörperliche Dinge, Grundstücke, Flächen, aber auch Tier bezeichnen (§90a BGB: Tiere sind keine Sachen, sie werden nur so behandelt, wenn es kein besonderes Recht gibt).

Ach ja, das Recht…​

Die Entität - Axiom

Drehen wir den Spieß mal um. Was ergibt denn überhaupt Sinn zu beschreiben, damit man in der fachlichen Welt damit umgehen kann?

  • Das Objekt muss beschreibbar sein…​ Bekloppte Forderung, aber wichtig. Nichtbeschreibbare Phantasie-Wesen, wie Gott [Sorry], sind nicht beschreibbar und an ihnen lässt sich nur schwer arbeiten.

  • Das Objekt muss abgrenzbar sein. Das heißt, dass ganz klar ersichtlich ist, was in dem Objekt inkludiert und was nicht. Nur so wissen wir, ob jedes Teilelement beschrieben, übergeben oder erfasst worden ist.

Daraus entwicklen wir mal folgendes Axiom zur Objekt-Definition und nennen sie Entität. (Ich war nicht der Erste!)

Important

Eine Entität ist von außen durch seine Beschreibung abgrenzbar.

BÄNG!

Der DatenMeister

Inhalte

Dieses Dokument gibt dir einen kurzen, ungeordneten Überblick über verschiedene Aspekte des DatenMeisters.

Jedes Feature wird in einem Kapitel des Dokumentes behandelt und ist in jeweils drei Unterbereiche unterteilt:

  1. Eine Beschreibung für den Endnutzer

  2. Eine Beschreibung für den Modellierer des Datenmodells

  3. Eine Beschreibung des internen Verhaltens des DatenMeisters für Entwickler

  4. Eine Beschreibung der Software-Architektur und des Sourcecodes

Jedes Feature wird in Bezug auf diese vier Aspekte durchgegangen. Im Abschluss wird nochmals insgesamt über die SW-Architektur diskutiert.

Extents

Ein Extent ist eine Sammlung von Objekten in einem abgeschlossenen Container. Innerhalb des DatenMeister ist dies eine Datei, eine Datenbank oder eine dynamische Objektsammlung, die jeweilig über eine Konfiguration (LoaderConfig) eingeladen worden ist.

Das Auflösen (Resolving) von Objekten

Jeder UriExtent besitzt eine oder mehrere Adressen über das er gefunden werden kann.

Elemente können über eine ID abgerufen werden kann.

Das UriExtent unterstützt folgende Abfrageschema:

Typ Beschreibung

Abfrage per ID

Der Uri des Extents wird über ein '#' die Objekt-ID angehängt. Der Text hinter diesem identifiziert das Object per ID

  • dm:///datenbank/#objectid

Abfrage per Name

Der Uri des Extents wird über ein '?fn=' der volle NAme des Objekts angehängt

  • dm:///datenbank/?fn=team_Frankfurt::player_1

Abfrage einer Eigenschaft

Nachdem das Element über einer der obigen Verfahren identifiziert worden ist, kann über den QueryString-Parameter 'prop' eine Eigenschaft des Objektes selektiert werden. Der Inhalt der Eigenschaft wird zurückgegeben

  • dm:///datenbank/?fn=team_Frankfurt::player_1&prop=age

  • dm:///datenbank/?prop=age#objectid

Abfrage einer Datenansicht

Nachdem eine reflektive Auflistung (reflectiveCollection) über eines der obigen Schemas selektiert worden ist, kann dieses über eine Datenansicht modifiziert werden. Die Auflistung wird dieser Datenansicht als 'input'-Knoten übergeben.

Hinweis: Die Url der Datenansicht muss Urlcodiert übergeben werden.

  • dm:///datenbank/?fn=team_Frankfurt::player_1&prop=children&dataview=dm:///views/%23childrenView

Aktionen und Aktionssammlungen

Über die Aktionen kann der Nutzer des Datenmeister eine Sequenz von Aktivitäten definieren, die im DatenMeister-Kontext ausführbar sind.

Hierzu gibt es die beiden Basisklassen: . Action . ActionSet

Jede Aktion hat folgende Eigenschaften:

Name Beschreibung

name

Name der Aktion

isDisabled

Flag, ob die Aktion deaktiviert ist und damit in der Aktionssammlung übersprungen wird.

ActionSet

Ein ActionSet (Aktionssammlung) sammelt verschiedene Aktionen.

Name Beschreibung

name

Name der Aktionssammlung

Action

Die Basisklasse Action repräsentiert eine Aktion. Allerdings muss diese Klasse abgeleitet werden, damit die Aktion konkretisiert wird.

Name Beschreibung

name

Name der Aktion

LoggingWriterAction

Schreibt einen fixen Text in das konfigurierte Logging.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

message

Nachricht, die in das Log geschrieben werden soll.

CommandExecutionAction

Führt einen Prozess aus und wartet bis der Prozess abgeschlossen worden ist.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

command

Prozess, der gestartet wird. Der Prozess wird über System.Diagnostics.Process gestartet und sollte eine ausführbare Datei bezeichnen

arguments

Argumente, die dem Prozess mitgegeben werden

workingDirectory

Das Arbeitsverzeichnis zu dem der Prozess wechseln soll. Dieser wird um die Umgebungsvariablen erweitert.

PowershellExecutionAction

Schreibt eine Skript-Datei und führt diese dann mit Hilfe von Microsoft Powershell aus. Hierbei wird die Powershell-Instanz genutzt, welche über die normale Pfad-Variablen aufrufbar sind.

Name Beschreibung

script

Das Skript, welches ausgeführt wird.

workingDirectory

Das Arbeitsverzeichnis zu dem der Prozess wechseln soll. Dieser wird um die Umgebungsvariablen erweitert.

LoadExtentAction

Führt einen Prozess aus und wartet bis der Prozess abgeschlossen worden ist.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

configuration

Die Extent-Konfiguration, die zum Laden genutzt wird.

DropExtentAction

Löscht einen Extent aus der Datenbank.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

workspace

Workspace aus dem der Extent gelöscht werden soll.

extentUri

Uri des Extents welches gelöscht werden soll.

CreateWorkspaceAction

Erstellt einen neuen Workspace.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

workspace

Name des Workspaces welcher erzeugt werden soll.

annotation

Beschreibung des Workspaces

DropWorkspaceAction

Löscht einen Arbeitsbereich aus der Datenbank.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

workspace

Workspace aus der Datenbank gelöscht werden soll.

ClearCollectionAction

Löscht alle Elemente einer Sammlung. Dies kann ein komplettes Extent sein oder auch die Eigenschaft eines Objektes welches die Sammlung enthält.

Name Beschreibung

workspace

Der Arbeitsbereich in dem das Objekt gefunden wird. Standard ist 'Data'

path

Der Pfad, der auf eine Sammlung verweist. Dies kann ein Extent oder eine Eigenschaft eines Objektes sein

CopyElementsAction

Kopiert alle Unterelemente von einem Objekt oder Extent zu einem anderen Extent.

Abgeleitet von Action

Name Beschreibung

sourceWorkspace

Der Arbeitsbereich in dem die Quell-Elemente gefunden werden

targetWorkspace

Der Arbeitsbereich zu dem die Ziel-Elemente kopiert werden

sourcePath

Der Pfad in dem Quell-Arbeitsbereich aus dem die Elemente geholt werden.

targetPath

Der Pfad in dem die Elemente kopiert werden.

Regeln für Quell-Elemente
  • Wenn der Pfad zum Quell-Element eine ReflectiveCollection ist, werden alle Elemente dieser kopiert oder verschoben.

  • Wenn der Pfad zum Quell-Element ein Extent ist, werden alle Elemente des Extents kopiert oder verschoben.

  • Wenn der Pfad zum Quell-Element ein Objekt selbst ist, wird nur dieses kopiert oder verschoben.

Regeln für Ziel-Elemente
  • Wenn der Pfad zum Ziel-Element eine ReflectiveCollection ist, werden alle Elemente in diese kopiert oder verschoben.

  • Wenn der Pfad zum Ziel-Element ein Extent ist, werden alle Elemente in diese kopiert oder verschoben.

  • Wenn der Pfad zum Ziel-Element ein Objekt selbst ist, werden die Elemente in die Standard-Eigenschaft (meist 'packagedElement') des Elements geschoben.

ExportToXmiAction

Nimmt eine Sammlung von Objekten, kopiert diese in einen Xmi-Extent und exportiert die dahinterliegende Xml-Datei als Xml.

Name Beschreibung

sourceWorkspaceId

Definiert den Quell-Arbeitsbereich aus dem die Daten für den Export vorbereitet werden.

sourcePath

Definiert den Quell-Pfad der zum Auffinden der Daten genutzt wird.

filePath

Pfad in dem das Xmi exportiert wird.

ItemTransformationAction

Nimmt jedes einzelne Objekt des gewählten Extents und übergibt es dem Transformationsobjekt welche die Schnittstelle IItemTransformation implementiert.

Das gewählte Objekt und all seine Unterelemente (rekursiv) werden übergeben.

Name Beschreibung

metaClass

Ein optionaler Filter auf die Meta-Klassen auf die gefiltert werden kann. Nur Elemente dieser Metaklassen werden der Transformation übergeben.

runtimeClass

Der volle Name der .Net Klasse, die instanziiert wird um die gewählten Objekten dieser zu übergeben. Diese Klassen kann dann die Transformation vornehmen.

workspace

Arbeitsbereich in dem der Pfad ausgeführt wird.

path

Uri, die das Extent oder die Objekte selektiert

excludeDescendents

True, falls nur die selektierten Objekte gewählt werden sollen und nicht die darunterliegenden Unterobjekte.

Schnittstelle IItemTransformation

Diese Schnittstelle kann von den Implementierungen umgesetzt werden, die die ItemTransformation gemäß obiger Darstellung durchführen soll.

Diese besitzt folgende Methode

void TransformItem(IElement element, IElement actionConfiguration);
  • element: Beschreibt das Objekt welches transformiert wird. Dieses wird direkt bearbeitet

  • actionConfiguration: Erweiterte Konfiguration, die der Action-Instanz selbst entspricht.

SimpleReportAction

Erzeugt einen einfachen Bericht.

Name Beschreibung

workspaceId

Id des Arbeitsbereiches

path

Pfad der die Elemente identifiziert über die der Report erzeugt wird.

configuration

Konfiguration es einfachen Berichtes vom Typ SimpleReportConfiguration.

filePath

Dateipfad in dem der Report abgelegt wird. Ist kein Pfad angegeben, so wird eine temporäre Datei auf dem Desktop erzeugt.

Plugins

Phasen

BeforeBootstrapping

Bevor der MOF und UML-Extent eingeladen wird und die Workspaces for MOF und UML zur Verfügung stehen

AfterBootstrapping

Nachdem die Workspaces for MOF und UML zur Verfügung stehen

AfterInitialization

Nachdem die internen Datentypen und der Extent Manager initialisiert worden sind.

AfterLoadingOfExtents

Nachdem der ExtentManager alle aktiven Extents eingeladen hat.

Import von Excel-Dokumenten

Hierarchischer Excel Import

Über die Import-Konfiguration 'HierarchicalExcelImportSettings' unterstützt der DatenMeister den Import von Exceldokumenten, die nach folgendem Schema aufgebaut worden sind.

hierarchical excel import

Diese Tabelle wird in eine Baumstruktur mit drei Ebenen umgewandelt:

Liga
> Team
> > Spieler

Dazu dient folgende Konfiguration

ExcelLoaderConfig
Name Bedeutung

filePath

Dateiname über den importiert wird

extentUri

Uri des entstehenden Extents

workspaceId

Id des Arbeitsbereiches in dem der entstehende Extent eingefügt wird

sheetName

Name des Excel-Sheets aus dem importiert wird

hasHeader

Flag, ob die erste Spalte des Excelsheets Überschriften bezeichnet

idColumnName

Name der Spalte, die gegebenenfalls die Id beinhaltet

countRows

Anzahl der Zeilen, die einzulesen sind. Wenn 0 oder negativ wird versucht automatisch zu ermitteln wieviel Zeilen abzuarbeiten sind

countColumns

Anzahl der Spalten, die einzulesen sind. Wenn 0 oder negativ wird versucht automatisch zu ermitteln wieviel Spalten abzuarbeiten sind

offsetRow

Anzahl der Zeilen, die zuerst übersprungen werden um das Excel einzulesen. Damit muss das Excel nicht zwingend bei A1 beginnen.

offsetColumn

Anzahl der Spalten, die zuerst übersprungen werden um das Excel einzulesen. Damit muss das Excel nicht zwingend bei A1 beginnen.

ExcelHierarchicalLoaderConfig

Abgeleitet von ExcelLoaderConfig

Name Bedeutung

filePath

Dateiname über den importiert wird

extentUri

Uri des entstehenden Extents

workspaceId

Id des Arbeitsbereiches in dem der entstehende Extent eingefügt wird

sheetName

Name des Excel-Sheets aus dem importiert wird

hasHeader

Flag, ob die erste Spalte des Excelsheets Überschriften bezeichnet

idColumnName

Name der Spalte, die gegebenenfalls die Id beinhaltet

countRows

Anzahl der Zeilen, die einzulesen sind. Wenn 0 oder negativ wird versucht automatisch zu ermitteln wieviel Zeilen abzuarbeiten sind

countColumns

Anzahl der Spalten, die einzulesen sind. Wenn 0 oder negativ wird versucht automatisch zu ermitteln wieviel Spalten abzuarbeiten sind

offsetRow

Anzahl der Zeilen, die zuerst übersprungen werden um das Excel einzulesen. Damit muss das Excel nicht zwingend bei A1 beginnen.

offsetColumn

Anzahl der Spalten, die zuerst übersprungen werden um das Excel einzulesen. Damit muss das Excel nicht zwingend bei A1 beginnen.

hierarchicalcolumns

Spalten-Definitionen, die die verschiedenen Hierarchie-Stufen beschreiben. Diese Liste von Elementen beschreibt in der Reihenfolge der Spaltentiefe welche Inhalte beschrieben werden.

ExcelHierarchicalColumnDefinition
Name Bedeutung

name

Name der Spalte. Dies ist üblicherweise die Überschrift

metaClass

MetaClass, die diese Spalte beinhaltet

property

Eigenschaft in dem die Kinder des Elements gespeichert werden. Für die letzte Spalte hat diese Eigenschaft keine Bedeutung mehr.

Öffentliche Einstellungen

Die öffentlichen Einstellungen (PublicSettings) wird über die Datei 'DatenMeister.Settings.xmi' konfiguriert, die im Verzeichnis der ausführbaren Datei (.exe) liegen muss.

Diese Datei ist eine Xmi-Datei mit einem settings-Knoten und sieht beispielhaft folgendermaßen aus:

<xmi>
    <settings
		windowTitle = "The IssueMeister"
        databasePath="%LOCALAPPDATA%/IssueMeister">
        <environnemtVariable key="import_path" value="c:\import-folder" />
    </settings>
</xmi>

Folgende Eigenschaften werden unterstützt:

Name Eigenschaft

windowTitle

Name des Hauptfensters. Standardmäßig 'DatenMeister'

databasePath

Pfad in dem die Hauptkonfiguration gespeichert wird. Dies sind üblicherweise die benutzerdefinierten Typen und Formulare, aber auch die Registrierung von Workspaces und Arbeitsbereichen

isReadOnly

Flag, ob der DatenMeister im Read-Only Modus gestartet werden soll

logLocation

Definiert an welcher Stelle das Logging durchgeführt werden soll.

  • Application: Im Applikationsverzeichnis (Standard)

  • LocalAppData: Im Unterverzeichnis 'DatenMeister' der LocalAppData

  • Desktop: Direkt auf dem Desktop

  • None: Es findet kein Logging in einer Datei statt.

environmentVariable

Weitere Umgebungsvariablen können hier eingefügt werden. Diese werden ohne Präfix direkt in die Umgebungsvariablen des Prozesses eingefügt.

Es können mehrer Umgebungsvariablen angegeben werden, die folgende Eigenschaften haben können:

  • key: Name der Variable

  • value: Wert der Variablen

Umgebungsvariablen

Beim Einladen der öffentlichen Einstellungen wird der Datenbankpfad in die Umgebungsvariable "dm_databasepath" übertragen und ist damit für das Einladen der Extents verfügbar.

Weiterhin werden die Umgebungsvariablen gemäß der Eigenschaften der 'environmentVariable' übertragen.

Extents

Das Laden von Extents

Konfigurationen
ExtentLoaderConfig
ExtentFileLoaderConfig

Abgeleitet

ExtentLoaderConfig

Registriert über

Abstrakte Konfiguration

ExcelExtentLoaderConfig

Abgeleitet

ExtentFileLoaderConfig

Registriert über

Abstrakte Konfiguration

ExcelImportExtentLoaderConfig

Abgeleitet

ExcelExtentLoaderConfig

Registriert über

DatenMeister.Excel.Integration.ExcelPlugin

ExcelReferenceExtentLoaderConfig

Abgeleitet

ExcelExtentLoaderConfig

Registriert über

DatenMeister.Excel.Integration.ExcelPlugin

InMemoryLoaderConfig

Abgeleitet

ExtentLoaderConfig

Registriert über

DatenMeister.Integration.Integrator

XmiStorageLoaderConfig

Abgeleitet

ExtentFileLoaderConfig

Registriert über

DatenMeister.Provider.XMI.XmiPlugin

XmlReferenceLoaderConfig

Abgeleitet

ExtentFileLoaderConfig

Registriert über

DatenMeister.Integration.Integrator

CsvExtentLoaderConfig

Abgeleitet

ExtentFileLoaderConfig

Registriert über

DatenMeister.Provider.CSV.CsvPlugin

Datenansichten (DataViews)

Über Datenansichten erhält der Modellierer und Nutzer Zugriff auf Sammlungen von Objekten oder Instanzen von Objekten.

Die Datenansichten sind im Namespace DatenMeister.Models.Namespace definiert.

Eine Datenansicht referenziert einen Ansichtsknoten (ViewNode), der eines oder mehrere Objekte zurückgibt. Dieser Knoten können miteinander verkettet werden, damit auch komplexe Datenaggregationen möglich sind.

Wenn ein Datenknoten ein Objekt repräsentiert, so ist es alleinig in der Datensammlung vorhanden.

Evaluierte Texte

Der DatenMeister bietet neben der statischen Zuordnung von Inhalten von Objekteigenschaften zu Texten auch eine Möglichkeit diese Eigenschaften mit Hilfe des Scriban Frame-Works zu evaluieren und so dynamischer die Inhalte der Objekte darstellen.

Das Scriban-Objekt {{i}} enthält das aktuelle Element, welche bearbeitet wird. Ist das aktuelle Objekt eine Person, so erhält man über "{{i.name}}"" den Namen der Person zurück. Über "Hallo {{i.prename}} {{i.name}}" begrüßt man ihn.

Das Präfix <% ist reserviert, um zukünftige Alternativen Evaluierer zu unterstützen.

Typischerweise kann die Evaluierung eines Texts über die Eigenschaft 'eval{Property}' gesteuert werden, wobei Property der Name der Eigenschaft ist, die üblicherweise die statische Zuordnung zwischen anzuzeigenden Inhalt und Objekt-Eigenschaft festlegt.

Item Name Description

i

Das Element, welches im Parser genutzt wird. Je nach Kontext kann dies ein Extent, eine Sammlung oder ein Element selbst sein.

v

Befindet sich der Parser gerade im Kontext eines Ansichtsobjektes, so enthält die Variable 'v' die Instanz des Ansicht. Dies kann zum Beispiel der Absatz sein, die Tabellen- oder Zellenbeschreibung.

Formulare

Es gibt drei Arten von Hauptformularen:

  • Detail-Formular

  • Listen-Formular

  • Extent-Formular (eigentlich sollte es Objekt-Formular heißen)

Form

Das Formular im Allgemeinen unterstützt folgende Eigenschaften. Alle Ableitungen haben auch diese Eigenschaften zu unterstützen.

Name Bedeutung

name

Name des Formulars

title

Titel, wie er angezeigt wird

isReadOnly

Flag, ob das Formular im schreibgeschützten Modus angezeigt wird

hideMetaInformation

Wahr, wenn im Formular nicht automatisch die Meta-Informationen eines Objektes angezeigt werden soll.

originalUri

Da das Formular bei der Anzeige geklont wird, enthält diese Eigenschaft die Url vor dem Klonvorgang.

ExtentForm

Ein Extent Form ist enthält einen Satz von Formularen um ein konkretes Objekt anzuzeigen.

Das Extent Form wird prinzipiell im Hauptfenster bei der Ansicht der Elemente eines Extents genutzt oder auch wenn der Nutzer im Hauptfenster ein konkretes Objekt ausgewählt hat.

Package Form

Ein besonderes Formular ist die Listenansicht der Package-Objekte. Hier kann der Nutzer über die 'Eigenschaft' der preferredTypes festlegen, welche Klasseninstanzen bevorzugt in diesem Package angelegt werden können.

Implementierung

Die Evaluierung erfolg im FormsPlugin per FormsModificationPlugin, welcher hier ein besonderes Regelwerk enthält.

Es können sich hier verschiedene Plugins registrieren, die nachträglich nochmals ein Formular verändern dürfen.

ListForm

Das Listenformular beschreibt eine Tabelle bzw. reine Auflistung einer Sammlung von Objekten:

Name Bedeutung

property

k.A.

metaClass

k.A.

includeDescendents

k.A.

noItemsWithMetaClass

k.A.

inhibitNewItems

k.A.

inhibitDeleteItems

k.A.

defaultTypesForNewElements

k.A.

fastViewFilters

k.A.

field

Diese Auflistung enthält die Felder, die in der Liste angezeigt werden sollen. Üblicherweise sind dies die Spalten der Tabelle

sortingOrder

Die Reihenfolge in der die Items angezeigt werden sollen.

viewNode

In diesem Formular kann nochmals konkreter über eine Datenansicht gefiltert oder verändert werden. Die eigentliche Liste wird als dynamische Datensammlung input übergeben.

Feld-Typen

Jedes Formular besteht aus einer Sammlung von Feldern. Hier werden folgende Felder unterstützt

FieldData

Diese Basis-Klasse stellt die generischen Eigenschaften zur Verfügung, die von jedem Feld unterstützt werden sollten.

Name Bedeutung

name

Name des Feldes und der dahinterliegenden Eigenschaft des Objektes

title

Titel, der im Formular angezeigt wird

isEnumeration

Flag, ob die Inhalte hinter der Eigenschafte eine Aufzählung sind oder ein einzelnes Element. Diese Eigenschaft wird von manchen Feldtypen zur automatischen Gestatung genutzt.

defaultValue

Falls der Wert nicht gesetzt ist, kann hier der Wert der Standard-Eigenschaft definiert werden.

isReadOnly

Flag, ob das Feld nicht beschreibbar ist.

TextFieldData

Dieses Feld drückt ein Text-Eingabefeld aus in dem der Nutzer einen freien Text eintragen kann.

Neben der Eigenschaften der FieldData werden noch folgende Eigenschaften unterstützt:

Name Bedeutung

lineHeight

Anzahl der Zeilen, die angezeigt standardmäßig angezeigt werden sollen

width

Breite in logischen Pixeln, die das Feld standardmäßig haben soll.

EvalTextFieldData

Diese Erweiterung des Textfelds unterstützt die dynamische Auswertung von Inhalten. Dies ist im besonderen relevant bei der Report-Erstellung, da hier das Format und andere Eigenschaften dynamisch ausgewertet werden können.

Nebenn der Eigenschaften der TextFieldData werden folgende Eigenschaften unterstützt:

Name Bedeutung

evalCellProperties

Das Skript, das zur Erstellung der Zelle ausgewertet wird.

  • Die Variable 'i' beschreibt das aktuell betrachtete Element

  • Die Variable 'c' die aktuelle Zelle. Die Eigenschaften des Zelle sind abhängig von verwendeten Report.

  • Die Variable 'r' der Zustand der aktuellen Zeile, wie sie im ListForm in der Eigenschaft 'evalRowProperties' definiert werden kann.

Formulare finden

Wie im vorherigen Kapital beschrieben sind die Formulare von den eigentlichen Daten entkoppelt. Um das Formular, gegebenenfalls bestehend aus Unterformularen, auswählen zu können, gibt es die FormAssociation, die einen Regelsatz festlegt über den das Formular einer Liste, einem Objekt oder einen Extent zugeordnet wird.

Die Modelle

FormAssociation

In dieser Instanz der Formular-Zuordnung wird das Regelwerk festgelegt

Name Bedeutung

name

Name der Formular-Zuordnung

formType

Typ des Formulars welches zugeordnet werden kann. Die möglichen Typen finden sich in der Tabelle unten wieder

metaClass

Wenn das selektierte Objekt oder die Liste dahinter von diesem Objekttyp ist, kann diese Zurodnung ausgewählt werden

extentType

Wenn das Extent von diesem Typ ist, kann dise Zuordnung ausgewählt werden.

viewModeId

Wenn der Nutzer in dieser Ansicht ist, kann diese Zuordnung ausgewählt werden

parentMetaClass

Wenn die Elemente einer Liste ausgewählt werden und das besitzende Objekt von diesem Typ ist, kann dieses ausgewählt erden.

parentProperty

Wenn die Elemente einer Liste ausgewählt werden und sich diese Liste in dieser Eigenschaft des besitzenden Objektes befindet, kann dieses ausgewählt ewrden.

form

Dies beschreibt das Formular welches ausgewählt werden kann, wenn die Eigenschaften oben zustimmen, soweit sie gewählt sind.

Die Formulartypen
Name Bedeutung Formular

Detail

Das Formular wird für die Detail-Ansicht eines Items angezeigt.

DetailForm, ExtentForm

TreeItemExtent

Das Formular wird angezeigt wenn der Nutzer ein bestimmtes Extent ausgewählt hat und alle Elemente des Extents angezeigt werden sollen.

ExtentForm

TreeItemDetail

Das Formular wird angezeigt wenn der Nutzer ein bestimmtes Element ausgewählt hat und nun in der Baumansicht dieses Element angezeigt werden soll. Dieser typ unterscheidet sich vom Detail, dass das Fenster nicht dediziert für das Element angelegt worden ist.

ExtentForm

ObjectList

Das Formular wird angezeigt, wenn alle Elemente einer bestimmten Eigenschaft in einer Subliste (SubElementField) angezeigt werden sollen.

ListForm

TreeItemExtentExtension

Dieses Formular wird dem ExtentForm hinzugefügt, wenn die Beschreibung der Formular-Zuordnung zu dem angezeigtne Formular passt.

Listform, DetailForm

TreeItemDetailExtension

Dieses Formular wird dem ExtentForm hinzugefügt, wenn die Beschreibung der Formular-Zuordnung zu dem angezeigten Formular passt.

Listform, DetailForm

Beschreibung des Verfahren

Detailansicht

In der Detailansicht wird die Formular-Zuordnung nach folgenden Eigenschaften gesucht:

datenmeister detailform
Name Bedeutung

formType

DetailForm

metaClass

Die Meta-Klasse des Objektes welches ausgewählt worden ist.

extentType

Typen (Getrennt durch Leerzeichen) des Extents in dem sich das angezeigte Objekt befindet

Extentansicht

In der Extentansicht kann der Nutzer entweder das Extent selbst markiert haben oder ein Element im Extent.

Diese Formulartypen werden TreeItemExtent und TreeItemDetail genannt.

Für die Darstellung des gesamten Extents werden folgende Eigenschaften in der Formular-Zuordnung definiert:

Extent Basis-Formular für die Baumansicht
Name Bedeutung

formType

TreeItemExtent

extentType

Typen des anzuzeigenden Extents

viewModeId

Die vom Nuutzer ausgewählte Ansicht

Extent Listen-Formular für die Baumansicht

Das Extentform besteht aus mehreren Reitern (Tabs). Wird nun ein Reiter automatisch erzeugt, kann eine Metaklasse angegeben werden, die dann die Inhalte beinhaltet.

Name Bedeutung

formType

TreeItemExtent

extentType

Typen des anzuzeigenden Extents

metaClass

Meta-Klasse der anzuzeigenden Objekte

Extent Objekt-Formular für die Baumansicht

Selektiert der Nutzer ein Element in der Baumansicht, so wird die Formular-Zuordnung nach folgendem Schema gesucht (FormsPlugin.GetItemTreeFormForObject):

Name Bedeutung

formType

TreeItemDetail

extentType

Typen des anzuzeigenden Extents

metaClass

Meta-Klasse des anzuzeigenden Objektes

viewModeId

Die vom Nutzer ausgewählte Ansicht. Ist im Package ein ViewMode als Eigenschaft angegeben, so

Extent Objektlisten-Formular für die Baumansicht

Werden automatisch Formulare für eine Objektansicht, wird je nach Konfiguration (ConfigurationFormCreatorSeparateProperties) entweder ein ListForm für jeden Typ und jede Eigenschaft erzeugt oder ein ListForm für jede Eigenschaft, die aber dann alle Objekt-Typen enthält.

Hier zu werden folgende Eigenschaften genutzt:

Name Bedeutung

formType

TreeItemDetail

extentType

Typen des anzuzeigenden Extents

parentMetaClass

Die Meta-Klasse der Objekte die selektiert sind.

parentProperty

Der Name der Eigenschaft der Objekte.

Automatische Erweiterung der Formulare

Nachdem das Formular gefunden, gewählt und erzeugt worden ist, wird in einer weiteren Abfrage-Runde definiert ob weitere Formularehinzugefügt werden sollen.

Hierzu werden die gleichen Formular-Zurordnungen genutzt, wie oben dargestellt, allerdings mit der Änderung des Form-Types:

  1. TreeItemExtent ⇒ TreeItemExtentExtension

  2. TreeItemDetail ⇒ TreeItemDetailExtension

Hierbei soll ein ListForm zurückgegeben werden.

Reports

Prinzipiell gibt es zwei verschiedene Arten von Reports für den Nutzer:

  1. Die einfachen Reports (SimpleReports)

  2. Der vollständige Html Report (HtmlReportCreator)

Einfacher Bericht

Von jedem beliebigen Extent kann über das Auswählen des Menüs 'Create Report' ein einfacher Report über die aktuelle Ansicht generiert werden.

TODO: BILD

Alternativ kann der Nutzer eine Instanz des Elements 'SimpleRpeortConfiguration' anlegen. In der Detailansicht des Elements wird ein Knopf 'Create Report' angelegt. Über diesen kann der Nutzer dann den Extent oder das Element auswählen über den der Report erzeugt werden soll.

TODO: Bild

Es wird eine zufällige Datei auf der Festplatte erzeugt, die dann über den Standardbrowser angezeigt wird.

Konfiguration

Der einfache Bericht wird über die Konfiguration SimpleReportConfiguration eingestellt:

Name Beschreibung

name

Name der Konfiguration

rootElement

Das Wurzelelement, dessen Eigenschaften angezeigt werden sollen.

showDecendents

true, falls auch dessen Kinder angezeigt werden sollen

showRootElements

true, wenn die Wurzelelemente angezeigt werden sollen

showMetaClasses

true, falls eine Spalte automatisch eingefügt werden soll, die die Meta-Klasse der Objekte anzeigt

showFullName

true, falls eine Spalte eingefügt werden soll, die den Pfad (voller Name) zum Objekt anzeugt

form

Falls kein automatisches Formular erzeugt werden soll, kann hier ein Formular angegeben werden. Dieser muss vom Type ListForm sein.

descendentMode

None, Inline, PerPackage

typeMode

PerType, AllModes

Der DescendentMode legt fest, ob pro Package eine neue Tabelle im Bericht angelegt werden soll.

Der TypeMode legt fest, ob pro Typ eine neue Tabelle im Bericht angelegt werden soll.

Der Html Report

Ein Report wird über zwei Konfiguration definiert:

  1. Über einer ReportDefinition kann der Nutzer das Format und die Elemente des Reports definieren. Dieses ist noch nicht mit den Datenquellen gekoppelt.

  2. Über die ReportInstance wird dann der eigentliche Report instanziiert. Hier werden die Datenquellen mit der Report Definition verknüpft.

reports classes.uxf
Report Definition
Report Instance

Die Report Instance besteht aus einer Referenz zur ReportDefinition und den Quellen der Daten. Diese verbinden den Namen der Quelle zu einer Url über die der DatenMeister die Daten einliest.

Das Auflösen der Url in der Quelle erfolgt mit Hilfe des WorkspaceResolvers des dazugehörigen Arbeitsbereiches.

Definition ReportInstance:

name

Name der Reportinstanz

reportDefinition

Referenz auf die Definition des Reports

sources

Sammlung von ReportInstanceSources, die dem Nutzer pro Report erlauben unterschiedliche Quellen anzugeben.

HtmlReportInstance

Abgeleitet aus der ReportInstance und ermöglicht den Export eines Html-Dokuments aus der ReporttDefinition.

AdocReportInstance

Abgeleitet aus der ReportInstance und ermöglicht den Export eines ADoc-Dokuments aus der ReportDefinition.

ReportInstanceSource

name

Name der Quelle

url

Url um das Extent, die Sammlung oder das Objekt zu referenzieren.

ReportParagraph:

Drückt einen Absatz im Report aus. Dieser kann einen statischen Text beinhalten oder auch dynamisch über evalParagraph oder evalProperties erzeugt werden.

name Name des Elements

paragraph

Standardtext, der angezeigt wird

viewNode

Falls eine Evaluierung stattfindet, beschreibt die ViewNode-Abfrage welches Objekt selektiert wurde. Das selektierte Objekt ist über die Instanz 'i' in den Parsern verfügbar.

cssClass

CSS-Klasse der Tabelle

evalParagraph

Wird gesetzt, wenn der Absatztext dynamisch erzeugt wird.

evalProperties

Wird gesetzt, wenn über den TemplateParser die Eigenschaften der Ansicht geändert werden soll. Die Definition des Absatz selbst ist über 'v' erreichbar.

ReportTable

Beschreibt eine Tabelle, die die Elemente eines ViewNodes ausdrückt. Über eine Formulardefinition werden die Spalten der Tabelle definiert.

name Name des Elements

viewNode

Beschreibt die dynamische Abfrage, die die Elemente selektiert, die in der Tabelle angezeigt werden sollen

form

Definiert das Formular. Dieses Formular soll vom Type ListForm instanziiert sein.

cssClass

CSS-Klasse der Tabelle

evalProperties

Führt eine Evaluierung aus. Die Elemente selbst sind über 'items' abrufbar.

Tabellenzelle des EvalTextFieldData

Eine Tabellenzelle unterstützt folgende Eigenschaften:

name Name des Elements

text

Textinhalt der Zelle

cssClass

Im Falle des Html-Reports, die CSS-Klasse der Zelle

SW-API

DatenMeister.dll

Module Runtime.ExtentStorage

Prinzipiell ist der DatenMeister in der Lage mit entkoppelten Extents zu arbeiten. Dies bedeutet, dass man Extents laden kann, die ohne zentralisierte Registrierung genutzt, bearbeitet und wieder gespeichert werden können.

Der DatenMeister unterstützt aber parallel eine zentrale Registrierung über den ExtentManager, welcher das Laden, das Sperren und das abgesicherte Abspeichern bei Beendigung der Applikation unterstützt.

Es gibt damit insgesamt zwei Datenbanken in den die Extents gespeichert werden.

  1. Innerhalb der Workspaces (WorkspaceLogic.GetWorkspaces()) sind die Extents eingefügt. Hierüber können Extents im normalen Datenbankprinzip gefunden werden. Hier ist aber nicht bekannt über welchen ProviderLoader das Extent von welcher Quelle geladen worden ist.

  2. Über die Registrierung des ExtentManager (ExtentStorageData) werden geladene Extents zum Zwecke der Nachverfolgung bein Locking und Speichern gespeichert. Der ExtentManager weist auch die genutzter ProviderLoader Config dem Extent zu.

Folgende Methoden werden bei der Verwendung von Extents genutzt:

  • Beim Einladen über LoadExtent wird das Extent eingeladen und registriert. Beim Einladen wird das Extent über seinen Provider auch gesperrt.

  • Beim Entladen über DetachExtent wird das Extent deregistriert, aber nicht gespeichert. Das Extent wird über seinen Provider auch wieder entsperrt.

  • Über LoadAllExtents findet das Einladen der ExtentLoaderConfig statt, die von der vorherigen Instanz speichert, welche Extents beim Hochfahren einzuladen sind. Das Einladen erfolgt dann auch über LoadExtent und führt damit zu einer Sperrung der Extents.

  • Über StoreAllExtents findet ein Write Trigger über alle geladenen und registrierten Events statt.

  • Über DeleteExtent wird das Extent nicht nur aus der Registrierung entfernt, sondern auch aus dem Workspace genommen.

  • Über UnloadManager werden die Extents entladen und der Zugriff auf die Registrierungs-Datei komplett aufgehoben. Die Extents selbst sind noch in den Workspaces, werden aber nicht mehr über den ExtentManager nachverfolgt.

Module.Reports

Die Generierung von Reports wird von zwei Report Generatoren unterstützt:

  • SimpleReport

  • TextReport

Simple Report

Implementiert in den Klassen SimpleReportConfiguration und SimpleReportCreator

Text Report

Übersetzungen

Folgende Übersetzungen gelten zwischen dem Deutschen und dem Englischen

Deutsch Englisch

Arbeitsbereich

Workspace

Datenansicht

Dataview

Formular-Zuordnung

FormAssociation

Öffentliche Einstellung

Public Setting

Reiter

Tab

Dynamische Laufzeit Provider

Ein dynamischer Laufzeit Extent (Dynamic Runtime Provider) ist ein programmierbarer Provider, dessen Inhalte über eine Klasse erzeugt werden und nicht über eine Datenbank.

Die Klasse selbst muss über die bestehende Plugin-Infrastruktur dem DatenMeister eingeladen sein,d as s

Konfiguration

Die Konfiguration des Providers erfolgt über DynamicRuntimeLoaderConfig und enthält folgende Eigenschaften:

Name Beschreibung

name

Name des Providers

extentUri

Uri des einzuladenen Extents

workspaceId

Id des Arbeitsbereiches in dem das zugehörige Extent eingeladen wird

runtimeClass

Voller Pfad (FullName) zur Klasse, die die Elemente enthält

configuration

Konfiguration, die dann dieser Klasse übergeben wird. Der Typ dieser Konfiguration ist nicht speziell definiert.

Implementierung

Der Laufzeitprovider wird über folgende eine Schnittstelle IDynamicRuntimeProvider zur Verfügung gestellt. Diese enthält folgende Methode:

IEnumerable<IProviderObject> Get(IElement configuration)

Hierbei enthält der Parameter configuration den Konfigurationsparameter, der in der LoaderConfig über configuration festgelegt wurde.

Der Laufzeitprovider gibt auf Aufruf eine Liste von Provider-Elementen zurück. Dieses können vereinfacht vom Typ InMemoryProviderObject sein.

Beispiel-Implementierungen

Modules.DynamicRuntimeProvider.NumberProvider

Nimmt eine Instanz von NumberProviderSettings auf und gibt eine Auflistung von Zahlen in Binär (binary), Oktal (octal), Dezimal (decimal) und Hexadezimal (hexadecimal) zurück.

Die Eigenschaften der Settings:

Name Beschreibung

start

Erster Wert der Auflistung. Standardwert ist 0

end

Letzter Wert der Auflistung. Standardwert ist 100

Trainings and Cheatsheets

MS Build

  • Standard Pfad:

    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin

Typischer Aufbau

<Project" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <PropertyGroup></PropertyGroup>
 <ItemGroup></ItemGroup>
 <Target></Target>
</Project>

Sonderzeichen

  • %: Metadaten

  • $: Eigenschaften

  • @: Elemente

  • ': Bedingungen

  • ;: Listentrennungen

Escaping: <Compile Include="MyFile.cs;MyClass.cs"/> -→ <Compile Include="MyFile.cs%3BMyClass.cs"/> <Compile Include="$([MSBuild]::Escape('MyFile.cs;MyClass.cs'))" />

Typische Eigenschaften (Property)

  • Eigenschaften unterscheiden keine Groß-/Kleinschreibung

Setzen
  • Setzen über Property Group:

    <PropertyGroup>
       <BuildDir>Build</BuildDir>
    </PropertyGroup>
  • Setzen über msbuild.exe

    msbuild.exe MyProj.proj -p:BuildDir=Build
    msbuild file.proj -p:Flavor=Debug;Platform=x86
  • Property Groups können auch innerhalb des Targets definiert werden.

  • Eine Eigenschaft kann auch ein Xml-Knoten sein.

  • Priorität:

    1. PropertyGroup mit Attribut 'TreatAsLocalProperty'

    2. MSBuild-Parameter

    3. Umgebungsvariablen

    4. PropertyGroup

Lesen
  • Lesen über '$(Property)'

  • Registrierung: $(registry:Hive\MyKey\MySubKey@Value))

  • Eigenschaftenfunktionen: $([System.DateTime]::Now.ToString("yyyy.MM.dd")) - Link

Relevante Eigenschaftfunktionen:
  • Pfad-Zusammenführung: $([System.IO.Path]::Combine($(MSBuildProjectDirectory), `BuildInfo.txt`))

  • Anhängen des trailing Slashes: $([MSBuild]::EnsureTrailingSlash($(path)))

Transformieren

Basierend auf den Meta-Informationen

@(RESXFile->'%(filename).resources') -> a.resx --> a.resources
Bedingte Auswertung
  • Setzen von Standard-Werten:

    <BuildDir Condition="'$(BuildDir)' == ''">c:\tools</ToolsPath>
Vordefinierte Eigenschaften:
  • $(MSBuildProjectDirectory): Pfad der Projektdatei ohne Datei selbst

  • $(MSBuildProjectFullPath): Pfad der Projektdatei inkl. Datei

  • $(MSBuildProjectName): Name der MSBuild-Datei ohne Erweiterung.

  • $(OutputPath): Ausgabepfad von Visual Studio

Typische Elemente (Items)

Setzen

Setzen von Elementen:

<ItemGroup>
   <Compile Include = "file1.cs"/>
   <Compile Include = "file2.cs"/>
</ItemGroup>

Alternative:

<ItemGroup><Compile Include = "file1.cs;file2.cs"/></ItemGroup>

Platzhalter:

<VBFile Include="D:/**/*.vb"/>
<VBFile Include="D:/**/*.vb" Exclude="Settings.vb"/>

Mit Metadaten:

<ItemGroup>
   <CSFile Include="one.cs;two.cs">
       <Culture>Fr</Culture>
   </CSFile>
</ItemGroup>
Lesen

Lesen von Elementen

@(Compile) ==> file1.cs;file2.cs

Auswerten von Meta-Daten: Standard-Metadaten

<Target Name="Batching">
      <Message Text="@(CSFile)" Condition=" '%(Culture)' == 'Fr' "/>
</Target>

Umwandlung mit Hilfe von Meta-Daten:

@(CppFiles -> '%(Filename).obj')

Entfernen von Element (nur innerhalb eines Targets erlaubt):

<Target>
   <ItemGroup><Compile Remove="*.config"/></ItemGroup>
</Target>
Elementfunktionen:
@(Compile->IndexOf('.')) ==> 3;5 (je nach Position)

Relevante Funktionen:

  1. →Count()

  2. →IndexOf()

  3. →Replace('a', 'b')

Ziele

<Target Name="Construct">
   <Csc Sources="@(Compile)" />
</Target>
  • Ein Ziel wird maximal einmal ausgeführt

Definition und Reihenfolge von Zielen
  • Erstes Ziel: Wenn nichts angegeben wird, wird das erste Ziel ausgeführt.

  • InitialTargets: Als Attribut ins Project. Wird immer ausgeführt.

    <Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  • DefaultTargets: Wenn nichts über msbuild.exe angegeben ist, wird dies hier ausgeführt.

    <Project DefaultTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  • BeforeTargets, AfterTargets: Hierüber kann eine Reihenfolge definiert werden.

  • DependsOnTargets: Gibt die Ziele an, die davor ausgeführt werden müssen.

Standard-Ziele
  • BeforeBuild: Vor dem Bauen

  • Build: Der Standard

  • AfterBuild: Nach dem Bauen

Aufgaben

  • Schnittstelle ITask in Microsoft.Build.Framework

  • Vorimplementierung Task in Microsoft.Build.Utilities.dll

  • Importieren von neuen Tasks:

    <UsingTask TaskName="Microsoft.Build.Tasks.ResolveNativeReference" AssemblyName="Microsoft.Build.Tasks.Core" />
    <UsingTask TaskName="SimpleTask3.SimpleTask3" AssemblyFile="SimpleTask3\bin\debug\simpletask3.dll"/>
  • Inlineaufgaben-Definition

  • Ignorieren von Fehlern:

    <Delete Files="@(Files)" ContinueOnError="WarnAndContinue"/>
Typische Aufgaben

Nachricht an die Konsole:

<Target><Message Text="$(BuildDir)" Importance="high"/></Target>

Erzeugen eines Ordners:

<MakeDir Directories = "$(BuildDir)" Condition = "!Exists('$(BuildDir)')" />

Entfernen eines Ordners:

<RemoveDir Directories="$(BuildDir)" />

Sonstiges

  • Importieren von Elementen

    <Import Project="Other.targets" />