2010-12-14 14 views
0

Ich habe eine Lösung mit zwei Projekten. Einer von ihnen ist ein einfaches Projekt, das nicht auf irgendwelche speziellen Assemblies angewiesen ist. Die Anwendung darf jedoch eine externe ausführbare Datei starten (die ich auch besitze - dies ist das zweite Projekt meiner Lösung). Wenn ich das Projekt erstelle, möchte ich, dass die ausführbare Datei (+ Abhängigkeiten wie app.config) des externen Projekts in das Zielverzeichnis meines Projekts kopiert wird.Kopieren von Dateien mit MsBuild

Wie kann ich dies mit MsBuild erreichen? Meine erste Idee war, einen Verweis auf die ausführbare Datei hinzuzufügen (obwohl ich sie nicht zum Erstellen brauche), um die Datei zu kopieren. Das scheint ein bisschen hacky für mich.

Danke!

P.S. Eine andere Frage: Sagen wir, dass ich MsBuild sagen kann, die ausführbare Datei zu kopieren. Was ist, wenn die ausführbare Datei nicht erstellt wird? Kann ich es zwingen zu bauen?

Antwort

1

Haben Sie den MSBuild-Kopiervorgang angesehen: Copy Task?

3

In Ihrem Fall sollten Sie Ihre MSBuild Script Ihre Lösung machen ersetzen und erklären, um die gewünschte Abhängigkeit gibt:

<Project DefaultTargets="Executable_A"> 
    <Target Name="Executable_A" DependsOnTargets="Executable_B"> 
     <MSBuild Projects="Executable_A.proj" Targets="Build" /> 
    </Target> 

    <Target Name="Executable_B"> 
     <MSBuild Projects="Executable_B.proj" Targets="Build"> 
      <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt" /> 
     </MSBuild> 
     <Copy SourceFiles="@(AssembliesBuilt)" DestinationFolder="C:\My_Target_Path\" SkipUnchangedFiles="true" /> 
    </Target> 
</Project> 

... und Sie können das Ziel Ihrer zweiten Projekt anweisen seine Ausgabe an die gewünschte kopieren Lage. Sie könnten Ihr erstes Projekt sogar anweisen, seinen Ausgabepfad in eine Variable zu speichern, die beim Kopieren der Ausgabe Ihres zweiten Projekts (DestinationFolder) verwendet werden soll.

+0

Eh Filburt, Ich habe gerade versucht, diese Lösung zu versuchen, und das ist genau das, was ich suche! Die Datei app.config (und andere Abhängigkeiten) von Executable_B wird jedoch nicht kopiert. Irgendeine Idee warum? – Martin

+0

@Martin huh ... Ehrlich gesagt müsste ich das selbst suchen. TargetOutputs greift nur das, was tatsächlich aus dem Projekt selbst erstellt wurde. Möglicherweise möchten Sie auch die SkipUnchangedFiles weglassen. Ich werde meine Antwort aktualisieren, sobald ich den richtigen Ausgabeparameter gefunden habe. – Filburt

+0

Ich habe immer noch keine Lösung gefunden. Irgendeine Idee? – Martin

0

Wenn Sie mit @Filburt Antwort zufrieden sind, kann ich vorschlagen, diese Lösung zu verbessern.

Wenn Sie einen Blick nehmen werden wie Standard Build- Ziel arbeitet:

<Target 
    Name="Build" 
    Condition=" '$(_InvalidConfigurationWarning)' != 'true' " 
    DependsOnTargets="$(BuildDependsOn)" 
    Returns="$(TargetPath)" /> 

Sie werden sehen, dass die einzige Ausgabe von Build oder neu erstellen Ziel $ (TargetPath) ist. $ (TargetPath) ist ein vollständiger Pfad zur erstellten Assembly. Um dieses Verhalten zu ändern, können Sie den Build-Prozess hacken. Aber es wird einfacher sein, passen Sie Ihr eigenes Ziel in Projekt zu definieren B:

<Target 
    Name="BuildWithConfig" 
    DependsOnTargets="Clean;Build" 
    Returns="$(TargetPath);$(TargetPath).config" /> 

In A Projekt definiert nur Afterbuild Ziel:

<Target Name="AfterBuild"> 
    <MSBuild Projects="Executable_B.proj" Targets="BuildWithConfig"> 
     <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt" /> 
    </MSBuild> 
    <Copy SourceFiles="@(AssembliesBuilt)" DestinationFolder="$(OutDir)\SubDirForB" SkipUnchangedFiles="true" /> 
</Target> 

Diese Lösung erfordert nicht zu Erstellen Sie ein benutzerdefiniertes Build-Skript. Sie erhalten das Ergebnis direkt in VS.

Verwandte Themen