Frage

Ich habe gerade das einrichten einer out-of-place-build-system ist für unsere bestehenden C++ - code mithilfe von geerbte Eigenschaft Bettlaken, eine Funktion, die scheint zu spezifisch sein, um die Visual C++ - Produkt.Gebäude out-of-Platz erfordert, dass viele von den Projekt-Einstellungen werden geändert, und die geerbte Eigenschaft der Blätter erlaubt, mich zu ändern, alle notwendigen Einstellungen nur durch das anbringen einer Eigenschaftenseite auf das Projekt.Ich bin die Migration unser team von C++/MFC für UI in C# und WPF, aber ich brauche, um die gleiche out-of-place-build-Funktionalität, hoffentlich mit dem gleichen Komfort.Ich kann nicht scheinen zu finden, eine Möglichkeit, dies mit C# - Projekte - die ich zum ersten mal sah, um zu sehen, wenn ich könnte Verweis auf eine MsBuild-Datei, aber konnte nicht einen Weg finden, dies zu tun.Ich weiß, ich könnte einfach verwenden von MsBuild für die ganze Sache, aber das scheint komplizierter als nötig.Gibt es eine Möglichkeit, kann ich definieren ein makro für ein Verzeichnis, und verwenden Sie es in den Ausgabe-Pfad, zum Beispiel?

War es hilfreich?

Lösung

Ich bin mir nicht ganz sicher, was ein "out-of-place" - build-system ist, aber wenn Sie nur müssen die Möglichkeit haben, kopieren Sie die kompilierte Dateien (oder andere Ressourcen) auf andere Verzeichnisse, die Sie tun können, damit durch das binden in die MSBuild-build-targets.

In unseren Projekten bewegen wir die kompilierten dlls in den lib Ordner und die Dateien in den richtigen stellen, nachdem ein build abgeschlossen ist.Dazu haben wir ein custom build .target-Datei, die erstellt die Target's, Property's und ItemGroup's, die wir dann verwenden, um füllen Sie unseren externen output-Ordner.

Unsere custom targets-Datei sieht ein bisschen aus wie diese:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ProjectName>TheProject</ProjectName>
        <ProjectDepthPath>..\..\</ProjectDepthPath>
        <ProjectsLibFolder>..\..\lib\</ProjectsLibFolder>

        <LibFolder>$(ProjectsLibFolder)$(ProjectName)\$(Configuration)\</LibFolder>
    </PropertyGroup>

    <Target Name="DeleteLibFiles">
        <Delete Files="@(LibFiles-> '$(ProjectDepthPath)$(LibFolder)%(filename)%(extension)')" TreatErrorsAsWarnings="true" />
    </Target>
    <Target Name="CopyLibFiles">
        <Copy SourceFiles="@(LibFiles)" DestinationFolder="$(ProjectDepthPath)$(LibFolder)" SkipUnchangedFiles="True" />
    </Target>

    <ItemGroup>
        <LibFiles Include=" ">
            <Visible>false</Visible>
        </LibFiles>
    </ItemGroup>
</Project>

Die .csproj-Datei in Visual Studio integriert mit diesem individuellen Ziel-Datei:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" ... >
    ...
    <Import Project="..\..\..\..\build\OurBuildTargets.targets" />
      <ItemGroup>
        <LibFiles Include="$(OutputPath)$(AssemblyName).dll">
          <Visible>false</Visible>
        </LibFiles>
      </ItemGroup>
    <Target Name="BeforeClean" DependsOnTargets="DeleteLibFiles" />
    <Target Name="AfterBuild" DependsOnTargets="CopyLibFiles" />
</Project>

In einer nussschale, das build-Skript zuerst sagt MSBuild laden Sie unser benutzerdefiniertes build-Skript, fügt dann die kompilierte Datei auf die LibFiles ItemGroup, und schließlich verbindet unsere benutzerdefinierte build-targets, DeleteLibFiles und CopyLibFiles, in die bauen Prozess.Wir richten dies für jedes Projekt in unsere Lösung, sodass nur die Dateien, die aktualisiert werden gelöscht/kopiert und jedes Projekt ist verantwortlich für seine eigenen Dateien (dlls, Bilder, etc).

Ich hoffe, das hilft.Ich entschuldige mich, wenn ich missverstanden, was bedeutet out-of-place-build-system und das ist völlig nutzlos für Sie!

Andere Tipps

Gibt es eine Möglichkeit, kann ich definieren ein makro für ein Verzeichnis, und verwenden Sie es in den Ausgabe-Pfad

Haben Sie schaute auf die pre-build-und post-build-Ereignisse zu einem Projekt?

Tatsächlich, pre-build-und post-build-Ereignisse scheinen nur an einem Ort hinzufügen, um die batch-Datei Befehle.Das würde mir nicht helfen zu set up die standard build-Verzeichnisse für unsere Projekte, leider.Und dass diese Ereignisse erstellen batch-Dateien scheint wie eine sehr 1980 ' s Ansatz für eine moderne Sprache wie C#, IMO.

Nach dem Graben einige mehr, und Experimentieren habe ich festgestellt, dass Sie hinzufügen können <Import> Richtlinie in Ihr .csproj-Datei.Wenn Sie dies tun, wird die IDE erscheint eine Warnung, dass es ein unsicheres Eintrag Punkt in Ihrem Projekt, aber Sie können diese ignorieren, und Sie können Sie überhaupt nicht erscheinen durch die Bearbeitung der registry-Eintrag, offensichtlich.Also das würde für mich ein Weg, um die Variablen enthalten die directory-Pfade, die ich brauche in die .csproj-Datei.

Jetzt, um die Output-Pfad zu finden, die es - leider, wenn Sie fügen Sie eine Zeichenfolge wie "$(MySpecialPath)/Debug" auf den Ausgabe-Pfad-Feld, und speichern Sie das Projekt, das $ und () chars sind umgewandelt in hex, und Ihre Datei erhalten, ist in eine Debug-Verzeichnis in ein Verzeichnis mit dem Namen "$(MySpecialPath)".Arrgghh.Wenn Sie Bearbeiten .csproj-Datei in einem text-editor, können Sie dies richtig ist jedoch, und es scheint zu funktionieren, solange der <Import> tag wird angezeigt, bevor die <PropertyGroup> mit den Ausgabe-Pfad.

Also, ich denke, die Lösung für mich sein wird, um einen standard OurTeam.Ziele MsBuild-Datei in einem standard-Speicherort, fügen Sie ein Installationsprogramm für die änderung der Registrierung, so dass es nicht Flagge Warnungen, und erstellen Sie dann benutzerdefinierte Projektvorlagen, <Import> diese Datei und Ausgabe-Pfad verwenden, werden die Eigenschaften definiert, die in der OurTeam.targets-Datei.Leider ist dies mehr Arbeit und eine weniger elegante Lösung, als das Grundstück Blatt-Mechanismus der Vererbung in C++.

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