# Manifest (.psd1)

#### Was ist ein Manifest?

Ein Manifest (`.psd1`) beschreibt ein PowerShell-Modul.

Während die eigentliche Programmlogik in einer `.psm1`-Datei liegt, enthält das Manifest Informationen über das Modul selbst.

Dazu gehören beispielsweise

- Version
- Autor
- Abhängigkeiten
- exportierte Befehle
- unterstützte PowerShell-Versionen
- Lizenzinformationen

Das Manifest enthält **keinen ausführbaren Programmcode**. Es dient ausschließlich als Beschreibung und Konfiguration eines Moduls.

---

## **Allgemein**

Das ist die Identität deines Moduls. Ohne das bist du einfach nur irgendein Skript mit Existenzkrise.

```powershell
@{
    RootModule        = "TestModul.psm1"
    ModuleVersion     = "1.7.0"
    GUID              = "ege0799e-734e-451d-9bb1-34983dd82f05"
    Author            = "ProgramMaster"
    CompanyName       = "Microsoft"
    Copyright         = "Microsoft i guess"
    Description       = "Ich beschreibe wundervoll, was das für ein Modul es ist"
}
```

##### **RootModule**

Hauptdatei (`.psm1` oder `.dll`)

##### **ModuleVersion**

Version (z. B. `1.0.0`)

##### **GUID**

Eindeutige ID

##### **Author**

Ersteller/Entwickler des Moduls

##### **CompanyName**

Unternehmen

##### **Copyright**

Urheberrechte

##### **Description**

Beschreibung des Moduls

---

## **Abhängigkeiten**

Hier sagst du: „Ich funktioniere nicht alleine, ich brauche andere.“

- `RequiredModules`   
    → Externe Abhängigkeiten  
    → Angabe über **Modulnamen** (PowerShell sucht es selbst)  
    → Müssen im System vorhanden sein (installiert / auffindbar, z.B. über `$PSModulePath`)  
    → Gehören **nicht** zu deinem Modul
- `RequiredAssemblies` – DLLs
- `ScriptsToProcess` – Skripte, die beim Laden ausgeführt werden
- `ModuleList` – Nur die Meta-Information welche andere Module zugehörig sind
- `NestedModules`  
    → Angabe über **Dateien/Pfade** (du sagst konkret, was geladen wird)  
    → Interne Bausteine deines Moduls  
    → Werden zusammen mit deinem Modul geladen  
    → Gehören **zu deinem Modul dazu**

---

## 🚀 Export (was nach außen sichtbar ist)

Das ist der Teil, wo du entscheidest, was du der Welt zeigst. Oder versteckst.

- `FunctionsToExport`
- `CmdletsToExport`
- `VariablesToExport`
- `AliasesToExport`

👉 Klassiker:  
`'*'` = alles exportieren  
oder explizit = bessere Kontrolle

---

## 🧠 Kompatibilität &amp; Anforderungen

Hier wird’s picky.

- `PowerShellVersion`
- `PowerShellHostName`
- `PowerShellHostVersion`
- `DotNetFrameworkVersion`
- `CLRVersion`
- `ProcessorArchitecture`

---

## 📦 Private Daten (der geheime Keller)

Alles, was du selbst definierst.

- `PrivateData` – Hashtable für eigene Infos

Beispiel:

```powershell
PrivateData = @{
    PSData = @{
        Tags = @('UI','Forms')
        ProjectUri = 'https://...'
    }
}
```

---

## 🌐 PSData (wichtig für Gallery etc.)

Teil von `PrivateData`, aber so wichtig, dass es eigentlich sein eigenes Ding ist.

- `Tags`
- `LicenseUri`
- `ProjectUri`
- `IconUri`
- `ReleaseNotes`

---

## 🧩 Sonstiges (der „Warum gibt’s das?“ Bereich)

Selten gebraucht, aber existiert halt:

- `FileList`
- `TypesToProcess`
- `FormatsToProcess`
- `CompatiblePSEditions` (`Desktop`, `Core`)
- `HelpInfoURI`

---

## 🔧 Mini-Beispiel

Damit du nicht nur trockene Theorie hast:

```powershell
@{
    RootModule        = 'MeinModul.psm1'
    ModuleVersion     = '1.0.0'
    GUID              = '12345678-abcd-1234-abcd-1234567890ab'
    Author            = 'Jonny'
    Description       = 'Mein erstes Modul'

    FunctionsToExport = @('Get-Thing', 'Set-Thing')

    PowerShellVersion = '5.1'

    PrivateData = @{
        PSData = @{
            Tags = @('Example','Test')
        }
    }
}
```

---

## Der eigentliche Punkt (den viele übersehen)

Du brauchst vielleicht **30% davon wirklich**.

Der Rest ist:

- entweder für Publishing
- oder für Leute, die Kontrolle lieben (oder Angst haben)

Wenn du lokal entwickelst:  
→ `RootModule`, `ModuleVersion`, `FunctionsToExport`  
→ fertig, läuft.