0

Ich habe MSBuild-Code, der Dateien mit einer bestimmten Build-Aktion (CompileFoo in diesem Beispiel) nimmt und Ausgabedateien (mit einer anderen Erweiterung) generiert. Dies ist der Code, den ich bisher habe:Wie kann MSBuild Dateien, die mit einem externen Tool erstellt wurden, in referenzierten Projekten korrekt verfolgen?

<Target Name="BuildFoo" BeforeTargets="Compile" 
    Inputs="@(CompileFoo)" 
    Outputs="@(CompileFoo -> '$(OutputPath)%(RelativeDir)%(Filename).bin')" > 

    <!-- makefoo doesn't know how to create directories: --> 
    <MakeDir Directories="$(OutputPath)%(CompileFoo.RelativeDir)"/> 
    <Exec Command="makefoo -o &quot;$(OutputPath)%(CompileFoo.RelativeDir)%(CompileFoo.Filename).bin&quot; &quot;%(CompileFoo.Identity)&quot;" /> 

    <ItemGroup> 
     <!-- Required so we can handle Clean: --> 
     <FileWrites Include="@(CompileFoo -> '$(OutputPath)%(RelativeDir)%(Filename).bin')"/> 
    </ItemGroup> 
</Target> 

Dies funktioniert gut, wenn ich es in einem Projekt gehören, die die endgültige EXE erzeugt.

Aber jetzt möchte ich es in einem Projekt arbeiten, das eine DLL erzeugt, die von der EXE referenziert wird (C# mit einer Assemblyreferenz), und ich muss diese generierten Elemente (die .bin Dateien in dem Beispiel) von der Ausgabeverzeichnis der DLL, in das Ausgabeverzeichnis der EXE.

Ich versuche, etwas ähnlich die Wirkung von dieser zu erhalten, wenn es in dem DLL-Projekt auftritt:

<Content Include="Test\Test.txt"><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory></Content> 

In diesem Fall wird die Test\Test.txt Datei im Ausgabeordner der EXE endet. Obwohl ich mir nicht sicher bin, ist das genau das Gleiche. (Kopiert es aus der Originaldatei oder aus dem DLL-Ausgabeordner?)

Ich versuche, etwas ziemlich kompatibel zu bekommen - speziell das wird auf VS2010 und VS Mac funktionieren.

Antwort

1

Der hier Trick ist das GetCopyToOutputDirectoryItems Target Return einen zusätzlichen AllItemsFullPathWithTargetPath Artikel zu machen:

<Target Name="IncludeFoo" BeforeTargets="GetCopyToOutputDirectoryItems"> 
    <ItemGroup> 
    <CompiledFoos Include="@(CompileFoo -> '$(OutputPath)%(RelativeDir)%(Filename).bin')"> 
     <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
     <TargetPath>%(RelativeDir)%(FileName).bin</TargetPath> 
    </CompiledFoos> 
    <AllItemsFullPathWithTargetPath Include="@(CompiledFoos->'%(FullPath)')" /> 
    </ItemGroup> 
</Target> 

(testet eine aktuelle MSBuild 15 Version verwenden) (Edited Version mit VS2010 -AR getestet)

+0

Dank! Ich musste einige kleinere Änderungen vornehmen, damit VS2010 es richtig handhaben konnte, und auch das 'TargetPath'-Ziel leicht korrigieren. –

Verwandte Themen