Frage

las ich John Robbins' Artikel TFS 2010 Build-Nummer und Montage Dateiversionen: vollständig in Synchronisierung mit msbuild nur 4.0 und ich frage mich, über den besten Weg zu gehen, um diese zu integrieren.

Der Download für den Artikel hat zwei Dateien, eine ist eine Zieldatei und eine ist eine proj-Datei.

Die Ziele Datei hat eine Reihe von Aufgaben eine Build-Nummer auf TFS-Build-Nummer basierend auf auskratzen (das gleiche verwendet für die Builds) und schreiben Sie diese Nummer aus bis zu einem gewissen Ort (nennen wir es BuildNumberFile) für den Verzehr durch andere Proj Dateien.

Die proj-Datei ist sehr einfach. Es importiert nur die oben genannten Ziele Datei, und erklärt dann ein Ziel mit dem Namen „All“, während auch Default auf dem Projektelement erklärt All als auch sein.

    <Project ToolsVersion="4.0" DefaultTargets="All" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <!-- The two required properties so the Wintellect.TFSBuildNumber tasks knows your major and minor values.-->
            <TFSMajorBuildNumber>3</TFSMajorBuildNumber>
            <TFSMinorBuildNumber>1</TFSMinorBuildNumber>
        </PropertyGroup>

        <Import Project="Wintellect.TFSBuildNumber.targets"/>

        <!-- Just ask for the version information files you need. These are here to show all the diffent ones in 
           Wintellect.TFSBuildNumber.Targets. You can change the names -->
        <Target Name="All"
              DependsOnTargets="WriteSharedCSharpAssemblyVersionFile;
                              WriteSharedVBAssemblyVersionFile;
                              WriteSharedCPPCLIAssemblyVersionFile;
                              WriteSharedCPPAssemblyVersionFile;
                              WriteSharedWiXAssemblyVersionFile;
                              WriteSharedTextAssemblyVersionFile;"/>
    </Project>

Ich habe zwei Fragen dazu:

  • Ich lerne immer noch MSBuild. Wenn der Name des Ziels nicht an anderer Stelle in den Zielen festgelegt ist, wird ausgeführt, das Ziel? Wie stelle ich sicher, dass dieses Ziel ausgeführt wird?
  • Sind die csproj Dateien sollten ein erklären einschliessen Gegenstand für den Ort, an dem BuildNumberFile ist, auch wenn es nicht bis compiletime existiert?
  • Do ItemGroups und haben umfassen eine DependsOnTargets oder etwas, das sie sicher, existiert die Datei machen können, bevor sie bauen?
  • Sind die gesamten Inhalte der Datei csproj dies in einem Ziel zu verpackenden soll mit, dass zum Ausdruck bringt DependsOnTargets für BuildNumberFile?

Danke!

War es hilfreich?

Lösung

Ich glaube, ich habe dies herausgefunden, aber zwei Leute gefördert meine Frage, damit ich es hier beantworten würde:

  • Sie können sicherstellen, dass ein Ziel durch Expression eine Abhängigkeit von von einem anderen Ziel ausgeführt wird. Microsoft.Common.targets aussetzt zwei Targets - Before und Afterbuild - ausdrücklich zum Zwecke der für Anpassbarkeit außer Kraft gesetzt wird. Ich fand den einfachste Weg, dies war <Target Name="BeforeBuild" DependsOnTargets="WriteSharedCSharpAssemblyVersionFile" /> zu tun, wo WriteSharedCSharpAssemblyVersionFile das Ziel in dem Download über den Link in der ursprünglichen Nachricht deklariert ist. Auch, wenn Sie neu in MSBuild, dieses Ziel Before müssen deklariert werden, nachdem die Microsoft.CSharp.targets importiert wird, aber die Standard-csproj Vorlage führt Sie in dies zu tun.

  • Das WriteSharedCSharpAssemblyVersionFile Ziel sollte in der Tat um die Datei zu einem zentralen Standort schreiben, da, wenn eine Lösung bauen, werden alle Ziele nur einmal ausgeführt. Alle Projekte sollten Sie die Datei von dieser Stelle verweisen, auch wenn es nicht vorhanden ist, da durch die Kompilierung geschieht (oder was noch wichtiger ist, durch die Zeitreferenzen aufgelöst werden), wird sich die Before Ziel laufen und die Datei vorhanden sein wird.

    • In meiner Struktur, ich habe diese Versionskontrolle von Dateien in einem Ordner direkt unter dem Zweig Stammordner. Da darüber hinaus die Datei generiert wird gebaut, ich habe es in das Ausgabeverzeichnis aufzubauen. Es scheint ein wenig seltsamen Dinge von dem Ausgang zu verweisen, aber es bewahrt die Invariante so an einem Ort alle Build-Produkte mit, dass das Ausgabeverzeichnis als Mittel einen sauberen der Durchführung weggeblasen werden kann.
  • In MSBuild Elemente bilden Eingänge in das System (in der Regel Dateien), so dass es seltsam an sich denken, je nach Zielen. Nach einigen Lern ??diese Frage nicht viel Sinn machen. In jedem Fall ist die Antwort nein.

  • Der gesamte Inhalt der Datei sollte in der Tat nicht alle in einem Ziel sein - alles, was erforderlich ist, ist die Wintellect.TFSBuildNumber.targets Datei am Anfang Ihrer csproj-Datei zu importieren, und Before der Abhängigkeit von WriteSharedCSharpAssemblyVersionFile erklären am Ende.

Hope, das hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top