2010-10-13 7 views
5

Ich habe über die Verwendung von "Custom.Before.Microsoft.Common.targets" lesen und „Custom.After.Microsoft.Common.targets ", um ein benutzerdefiniertes Ziel vor/nach jedem Projekt Build auszuführen, und ich möchte diese Technik verwenden, um Versionsinformationen zu ändern, während auf unserem Teamcity Build-Server zu bauen.MSBuild: Custom.After.Microsoft.Common.targets für native C++ Projekte in VS2010

Das Problem ist, dass, obwohl es für C# -Projekten funktioniert, ist es nicht für die native C++ Projekten zu arbeiten scheint.

Nachdem ich in der Microsoft.Cpp.targets-Datei gegraben habe, habe ich herausgefunden, dass dies für native C++ - Projekte durch die Einstellung $ (ForceImportBeforeCppTargets) und $ (ForceImportAfterCppTargets) implementiert wird.

Ich kann kein einziges Stück von Informationen, die im Internet über diese Technik für native C zu finden scheinen ++ obwohl apps, so frage ich, wenn ich in die richtige Richtung oder nicht suchen.

Jede Hilfe wird geschätzt.

+0

Warum verwenden Sie nicht die Ereignisereignisse Erzeuge Ereignisse und Erzeuge Vorereignis und Erzeuge Einstellungen? –

+0

Wir verwenden nicht die pre/post build-Ereignisse, weil sie immer ausgeführt werden, wir wollen etwas, das nur beim Build auf dem Buildserver läuft und auch die Versionsinformationen (und andere Informationen) vom Build-Server bekommt. Wir wollen auch nicht davon abhängig sein, ob ein Entwickler vergisst, etwas in diese Event-Einstellungen zu legen, er muss automatisch sein und "Custom.Before.Microsoft.Common.targets" bietet das aber anscheinend nicht für nativen Code. – Halt

Antwort

10

Für VC++ Projekte ist es ein bisschen anders. Sie definieren eine zu importierende Datei entweder am Anfang oder am Ende des Projekts. Um diesen Ansatz zu verwenden, müssen Sie definieren Werte für die Eigenschaften ForceImportBeforeCppTargets oder ForceImportAfterCppTargets. Wenn Sie beispielsweise eine Datei am Anfang des Projekts einfügen möchten, können Sie den Wert in der Befehlszeile eingeben. Zum Beispiel habe ich gerade ein dummy VC++ - Projekt mit dem Namen CppTets01 erstellt. Dann habe ich die beiden folgenden Beispieldateien erstellt.

Before.proj

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 


    <Target Name="CustomTargetInBefore" AfterTargets="Build"> 
    <Message Text="From CustomTargetInBefore" Importance="high"/> 
    </Target> 

</Project> 

After.proj

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <Target Name="CustomTargetInAfter" AfterTargets="Build"> 
    <Message Text="From CustomTargetInAfter" Importance="high"/> 
    </Target> 

</Project> 

Dann ausgeführt ich den folgenden Befehl ein:

msbuild CppTest01.vcxproj 
    /p:ForceImportBeforeCppTargets="C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\Before.proj"; 
    ForceImportAfterCppTargets="C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\After.proj" 

Das Ergebnis war C: \ Temp_NET \ Throwaway \ CppTest01 \ CppTest01> msbuild CppTest01.vcxproj/p: ForceImportBeforeCppTargets = "C: \ Temp_NET \ Wegwerf \ CppTest01 \ C ppTest01 \ Before.proj"; ForceImportAfterCppTargets = "C: \ Temp_NET \ Wegwerf \ CppTest01 \ CppTest01 \ After.proj“

Microsoft (R) Build Engine Version 4.0.30319.1 
[Microsoft .NET Framework, Version 4.0.30319.1] 
Copyright (C) Microsoft Corporation 2007. All rights reserved. 

Build started 10/18/2010 8:32:55 AM. 
Project "C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\CppTest01.vcxproj" on node 1 (default targets). 
InitializeBuildStatus: 
    Creating "Debug\CppTest01.unsuccessfulbuild" because "AlwaysCreate" was specified. 
ClCompile: 
    All outputs are up-to-date. 
    All outputs are up-to-date. 
ManifestResourceCompile: 
    All outputs are up-to-date. 
Link: 
    All outputs are up-to-date. 
Manifest: 
    All outputs are up-to-date. 
FinalizeBuildStatus: 
    Deleting file "Debug\CppTest01.unsuccessfulbuild". 
    Touching "Debug\CppTest01.lastbuildstate". 
CustomTargetInBefore: 
    From CustomTargetInBefore 
CustomTargetInAfter: 
    From CustomTargetInAfter 
Done Building Project "C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\CppTest01.vcxproj" (default targets). 


Build succeeded. 
    0 Warning(s) 
    0 Error(s) 

Time Elapsed 00:00:00.21 

Wie Sie aus der Ausgabe wurden die Ziele erfolgreich injiziert in den Build-Prozess zu sehen. Wenn Sie das zurück auf Custom.Before.Microsoft.Common.targets und Custom.Before.Microsoft.Common.targets beziehen möchten, dann sollten Sie wissen, dass die dort verwendete Technik ein bisschen anders ist. Insbesondere wenn Sie diese Dateien erstellen, werden sie automatisch in jedes C#/VB.NET-Projekt importiert. In diesem Fall müssen Sie diese Eigenschaft festlegen. Sie haben wirklich zwei Möglichkeiten:

  1. Sie diese Eigenschaft als Umgebungsvariable einstellen
  2. Sie eine andere Technik verwenden können, ImportBefore & ImportAfter, die VC++ spezifisch ist

Für # 1 Lass mich etwas erklären.Wenn Sie in MSBuild auf eine Eigenschaft mit der Syntax $ (PropName) zugreifen, sucht MSBuild in den Umgebungsvariablen nach einer vorhandenen Eigenschaft mit dem Namen PropName, um festzustellen, ob ein solcher Wert vorhanden ist. Ist dies der Fall, wird dieser Wert zurückgegeben . Wenn Sie also einen Build-Server haben, in den Sie eine Datei für jedes VC++ - Build einfügen möchten, erstellen Sie diese Eigenschaften einfach als Umgebungsvariablen. Jetzt für die andere Technik.

ImportBefore/ImportAfter In VC++ wird ein neues Konzept eingeführt. In Microsoft.Cpp.Win32.targets können Sie die Deklaration oben in der .targets-Datei sehen.

<Import Project="$(VCTargetsPath)\Platforms\Win32\ImportBefore\*.targets" 
Condition="Exists('$(VCTargetsPath)\Platforms\Win32\ImportBefore')" /> 

Dann gibt es eine nach unten hin

<Import Project="$(VCTargetsPath)\Platforms\Win32\ImportAfter\*.targets" 
Condition="Exists('$(VCTargetsPath)\Platforms\Win32\ImportAfter')" /> 

Eine ähnliche Einfuhranmeldung als auch für die anderen Zielplattformen vorhanden ist. Werfen Sie einen Blick auf die Dateien unter %ProgramFiles32%\MSBuild\Microsoft.Cpp\v4.0\Platforms\ für die spezifischen Namen.

Wenn Sie möchten, dass eine Datei importiert werden soll, erstellen Sie einfach eine Datei, die mit .targets endet, und legen Sie sie in den entsprechenden Ordner ab. Der Vorteil davon ist, dass es in jedes VC++ - Build für diese Plattform importiert wird und dass Sie viele verschiedene Dateien erstellen können. Der Nachteil ist, dass Sie sie in diesen speziellen Ordnern platzieren müssen. Das ist der Hauptunterschied zwischen beiden Techniken. Mit dieser ersten Technik können Sie den Speicherort der Datei über die Eigenschaft angeben, die nicht automatisch für jeden Build enthalten ist, aber für den zweiten Ansatz ist es möglich, aber Sie können den Speicherort nicht ändern

+0

Sorry, ich habe die falschen Informationen gegeben. Ich habe mir das etwas genauer angesehen und das Problem behoben. Ich habe meine Antwort aktualisiert, um meine Ergebnisse widerzuspiegeln. –

+0

Danke, ausgezeichnete Antwort, Sie haben bestätigt, was ich vermutete. Jetzt weiß ich, dass ich auf dem richtigen Weg bin. – Halt

+0

OK cool, Entschuldigung für die Entgleisung. –

3

Sie können Projektinhalt auch in eine der *.props Dateien von hinzufügen Verzeichnis %LOCALAPPDATA%\Microsoft\MSBuild\v4.0\

Es macht den gleichen Effekt.

Verwandte Themen