Skip to main content

Directory.Build.props / Directory.Build.targets

Directory.Build.props

Automatischer Import durch MSBuild

MSBuild importiert beim Build genau eine Directory.Build.props: die nächstgelegene Datei, beginnend im Verzeichnis der .csproj und nach oben wandernd.

Wichtig: Liegt z. B. unter src/Directory.Build.props eine eigene Datei, wird die Root-Directory.Build.props nicht automatisch geladen. Einstellungen aus dem Repository-Root (NuGet-Metadaten, GenerateDocumentationFile, SourceLink, LangVersion, …) gelten dann nicht, solange sie nicht explizit verknüpft werden.

Verschachtelte Props: Parent importieren

In jeder untergeordneten Directory.Build.props den Parent explizit importieren:

<?xml version="1.0" encoding="utf-8"?>
<Project>
  <Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />

  <!-- Lokale Ergänzungen oder Overrides -->
  <PropertyGroup>
    <TargetFrameworks>net8.0;net10.0</TargetFrameworks>
  </PropertyGroup>
</Project>

Warum $(MSBuildThisFileDirectory)../?

GetPathOfFileAbove sucht ab dem angegebenen Startverzeichnis. Ohne ../ würde die Suche in demselben Ordner beginnen und wieder diese Datei finden → Endlosschleife beim Import.

Mit ../ startet die Suche eine Ebene höher und findet die nächste Directory.Build.props Richtung Root.

Reihenfolge und Overrides

    Zuerst: Import der Parent-Props (Einstellungen von Root nach unten vererben). Danach: lokale PropertyGroup / ItemGroup (überschreiben Properties der Parent-Datei).

    Beispiel: Root setzt <GenerateDocumentationFile>true</GenerateDocumentationFile>, tests/Directory.Build.props setzt danach false, damit Testprojekte keine XML-Doku erzeugen und keine CS1591-Warnungen erzeugen.

    Directory.Build.targets

    Dasselbe Prinzip gilt für Directory.Build.targets: nur die nächste Datei wird automatisch importiert. Bei verschachtelten targets-Dateien ebenfalls den Parent per GetPathOfFileAbove importieren.

    Alternative: eine zentrale Props-Datei

    Statt Kette von Directory.Build.props kann man eine gemeinsame Datei (z. B. build/Repo.props) anlegen und sie aus jeder Directory.Build.props importieren. Der hier dokumentierte GetPathOfFileAbove-Ansatz ist jedoch der übliche Standard in mehrstufigen Repositories und entspricht dem Setup in htasys (src/, tests/, app/, ui/).