4 Stimmen

TFS MSBuild: $(ProjectDir) leer oder zufällig

Ich habe eine vcproj-Datei, die eine einfache Pre-Build-Ereignis im Sinne von enthält:

Helpertask.exe $(ProjectDir)

Dies funktioniert problemlos auf Entwickler-PCs, aber wenn die Lösung auf unserem TFS 2008-Build-Server unter MSBuild erstellt wird, ist $(ProjectDir) entweder leer oder verweist auf einen nicht verwandten Ordner auf dem Server!

Die beste Lösung, die ich bisher gefunden habe, besteht darin, die Entwickler- und Serverpfade hart zu kodieren:

if exist C:\DeveloperCode\MyProject   HelperTask.exe C:\DeveloperCode\MyProject
if exist D:\BuildServerCode\MyProject HelperTask.exe D:\BuildServerCode\MyProject

Dieser Hack funktioniert in Beitrag -Schritte zu bauen, aber es funktioniert nicht für eine vor -build-Schritt (der Pre-build-Task macht jetzt gar nichts mehr unter MSBuild!)

Haben Sie eine Idee für eine Lösung oder Umgehung? Ich habe nur noch sehr wenige Haare!

11voto

Ben Punkte 547

$(MSBuildProjectDirectory) hat bei mir funktioniert

1voto

Ich denke, dass Ihr Problem mit der Art und Weise zusammenhängt, wie die Artikel initialisiert werden. Das Include-Attribut eines Elements wird zu Beginn eines Builds ausgewertet. Wenn Sie also auf Dateien angewiesen sind, die während des Build-Prozesses erstellt werden, müssen Sie diese als dynamische Elemente deklarieren. Dynamische Elemente sind diejenigen, die innerhalb eines Ziels oder mit der CreateItem-Aufgabe definiert werden. Ich habe dies in meinem Blog ausführlich beschrieben MSBuild: Objekt- und Eigenschaftsbewertung .

Sayed Ibrahim Hashimi

Mein Buch: Einblick in die Microsoft Build Engine: Verwendung von MSBuild und Team Foundation Build

0voto

Gerrie Schenck Punkte 21800

Ich denke, das Problem ist, dass der Arbeitsbereich des Build-Servers wahrscheinlich nicht richtig initialisiert ist.

0voto

Jason Williams Punkte 55292

Ich hatte immer wieder Probleme damit - ich habe viele verschiedene Ansätze ausprobiert, aber sie sind alle auf mysteriöse Weise gescheitert.

Sobald $(ProjectDir) sich wieder richtig verhielt, hörte der Pre-Build-Schritt auf, den Befehl auszuführen (ich fügte echo-Befehle darüber und darunter ein - beide wurden ausgeführt, aber das Programm dazwischen nicht. Es wurden keine Fehler oder Ausgaben jeglicher Art generiert, die darauf hinweisen, warum der Schritt fehlgeschlagen ist).

Ich weiß nicht, ob es sich um einen fragwürdigen Server handelt oder ob MSBuild nur einen Scherz macht.

Ich habe jetzt aufgegeben. Ich habe dem Build-Server einen kräftigen Tritt verpasst und den Kurs gewechselt: Wir lassen dieses Tool jetzt offline (manuell) laufen und checken die Ergebnisse ein, damit der Build-Server sie verwenden kann. So viel zu einem automatisierten Build :-( Wenn MSBuild nur Lösungen auf die gleiche Weise wie Visual Studio ausführen würde - es ist verrückt, dass es die Umgebung völlig anders einrichtet (unterschiedliche Pfade, die aus den Lösungsvariablen kommen, Ouptus, die in andere Ordner umgeleitet werden, so dass man sie nicht dort finden kann, wo sie sein sollen, usw.)

0voto

Ich habe ein bestehendes Projekt verzweigt und $(ProjectDir) hat das alte Verzeichnis im neu verzweigten Code beibehalten. Aber das liegt daran, dass ich einige Kompilierungsfehler hatte. Sobald jedes Projekt in der Lösung ohne Fehler kompiliert wurde, änderte sich $(ProjectDir) in den richtigen Pfad.

Carlos A. Merighe

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X