fotolia 2605482 s 870x252

Wie die Projekt-Verzeichnisstruktur auf allen Entwickler-Rechner kurz und einheitlich halten?

Problem

Die Projekt-Struktur ist in TFS, Subversion oder einem anderen zentralen Repository eindeutig definiert und auf jeden lokalen Rechner übertragbar.

Leider ist der Einstiegspunkt - der Root - für das enthaltene in der Repository Projekt auf jedem Rechner anders. Das Projekt-Root-Verzeichnis kann vom Entwickler ausgewählt werden - "c:\dev", "c:\tfs", "c:\Subversion", "c:\Projekte". Manchmal muss es wegen Platzmängel auf einem anderen Laufwerk gespeichert werden - "d:\Projekte". Manchmal wird es wegen der Backup-Richtlinien von Unternehmen-IT dem Entwickler fest zugeordnet - "C:\Users\hansmustermann\Documents\Visual Studio 2015\Projects".

Um Kompilierungs- bzw. Deploying-Probleme zu vermeiden, werden innerhalb der Repository relative Pfade z.B. "..\..\bin\Debug" genutzt. Manchmal wird aber ein absoluter Pfad, z.B. in der Konfigurationsdatei oder als Kommandozeilen-Befehl, vorausgesetzt. Wegen des unterschiedlichen auf jedem Rechner Projekt-Root-Verzeichnisses ist der absolute Pfad in einem solchen Fall leider unbrauchbar.

Beispiel 1 – Speicherung einer Log-Datei

<system.diagnostics>
(...)
    <sharedListeners>
      <add name="MainTextListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="c:\Temp\DotNet.log"></add>
    </sharedListeners>
</system.diagnostics>

Beispiel2 – Definierung einer Solution-übergreifenden NuGet-Repository

Vorgegeben werden NuGet-Packages in demselben Order gespeichert, wo sich die Solution befindet - $(Solutiondir)\Packages

Gibt es allerdings mehrere Solutions und sind sie unterschiedlich in der Verzeichnisstruktur verschachtelt, so werden auch die Packages-Ordner unterschiedlich verschaltet.
Es führt zu Konflikten in den Assembly-Referenzen in Projekt-Dateien (*.csproj) die zu mehreren Solutions gehören.

<Reference Include="Serilog, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
  <HintPath>..\..\packages\Serilog.1.5.14\lib\net45\Serilog.dll</HintPath>
  <Private>True</Private>
</Reference>

Deshalb muss der Speicherort von NuGet-Repository in der Datei NuGet.Config zentralisiert werden.

<config>
  <add key="repositoryPath" value="D:\dev\MyProduct\Packages" />
</config>

Quelle: https://docs.nuget.org/consume/nuget-config-settings

Wegen des unterschiedlichen Root-Verzeichnisses würde der absolute Repository Path auf jedem Entwickler-Rechner anders aussehen.

Lösung

Der Projekt-Speicherort, obwohl auf jedem Entwickler-Rechner woanders lokalisiert, kann mit dem folgenden Kommandozeilen-Befehl vereinheitlicht werden.
SUBST P: D:\Projekte
Quelle: http://www.i8086.de/dos-befehle/subst.html

Zusätzlich ist es noch ratsam das temporäre Laufwerk zu definieren.
SUBST T: %temp%
Dank der o.g. Lösung wird der Projekt-Pfad einheitlich und kürzer. Jetzt steht nichts mehr im Wege die Log-Datei - "t:\DotNet.log" - oder die zentrale NuGet-Repository - "P:\Packages" - zu definieren.