2017-10-25 6 views
1

Im msbuild Skript unten, führen Sie das erste Mal, dass ich die csproject folgende Ziele in der Reihenfolge ausgeführt werden soll:Mit Kopieraufgabe mit unzip Aufgabe in msbuild

1) UnzipDLL
2) DeleteExtraneousDirs

Wenn ich

1) UnzipDLL
2) Copyfiles
3) DeleteExtraneousDirs

: wurde die csproject zum zweiten Mal, die folgenden Ziele gehen nacheinander auszuführen ausgeführt

Ich bin mir nicht sicher, warum das Ziel "CopyFiles" nicht das erste Mal ausgeführt wird. Ich habe auch versucht, die Zielaufträge durch Hinzufügen von "BeforeTargets", "AfterTargets" und/oder "DependsOnTargets" anzugeben, aber das CopyFiles-Ziel wurde nicht nach dem UnzipDLL-Ziel ausgeführt.

Wenn ich die DefaultTargets nur als "UnzipDLL" und "CopyFiles" angeben, wird nur der Task "UnzipDLL" ausgeführt, wenn ich das csproject-Projekt zum ersten Mal ausführe und beide Tasks "UnzipDLL" und "CopyFiles" zum zweiten Mal ausgeführt werden Die csporjects werden ausgeführt.

Unten ist das Msbuild-Skript. Danke für die Hilfe!

<Project ToolsVersion="14.0" DefaultTargets="UnzipDLL;CopyFiles;DeleteExtraneousDirs" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <ReleasePath>..\..\..\..\..\TDS</ReleasePath> 
    <RelDirectory>$(ReleasePath)\exe\dll\_rels</RelDirectory> 
    <LibDirectory>$(ReleasePath)\exe\dll\lib</LibDirectory> 
    </PropertyGroup> 
    <ItemGroup> 
    <LibFiles Include="$(ReleasePath)\exe\dll\lib\**\*.*;$(ReleasePath)\exe\dll\lib\*.*" /> 
    </ItemGroup> 
    <Target Name="UnzipDLL"> 
    <Unzip ZipFileName="$(ReleasePath)\exe\utils\TDS.Packages.1.0.0.nupkg" 
     TargetDirectory="$(ReleasePath)\exe\dll\" /> 
    </Target> 
    <Target Name="CopyFiles"> 
    <Copy SourceFiles="@(LibFiles)" DestinationFolder="$(ReleasePath)\exe\dll\%(RecursiveDir)" /> 
    </Target> 
    <Target Name="DeleteExtraneousDirs"> 
    <Delete Files="@(LibFiles)" /> 
    <RemoveDir Directories="$(RelDirectory);$(LibDirectory)" /> 
    </Target> 
</Project> 

UPDATE
Um SergeyL der Punkt, wird das Ziel ausgeführt Copyfiles erhalten. Die Kopieraufgabe kopiert jedoch nicht die Dateien aus dem Ordner "exe \ dll \ lib" in den Ordner "exe \ dll \". Ich habe das herausgefunden, indem ich Nachrichtentasks vor und nach der Kopieraufgabe hinzugefügt habe.

+0

Woher wissen Sie, dass das CopyFiles-Ziel nicht ausgeführt wird? Hast du das Bauprotokoll? Sie können verwenden, um explizit zu protokollieren, dass ein Ziel ausgeführt wurde. –

+0

Kühl. Wusste nicht, dass ich die Nachricht dazu benutzen könnte. Wird herausfinden, wie das geht. Zwei Möglichkeiten, die ich kenne: 1) Lib-Dateien wurden nicht in den DLL-Ordner kopiert. 2) Ich sehe die Kopie nicht im Msbuild-Befehlsfenster. – rds80

Antwort

1

Ich bin mir nicht sicher, warum das "CopyFiles" -Ziel nicht das erste Mal ausgeführt wird ... aber das CopyFiles-Ziel wurde nicht nach dem UnzipDLL-Ziel ausgeführt.

Das Problem war ItemGroup. Es muss in das Kopierziel geschrieben werden.

sollte das msbuild Skript sein:

<Target Name="CopyFiles"> 
    <ItemGroup> 
     <LibFiles Include="$(ReleasePath)\exe\dll\lib\**\*.*;$(ReleasePath)\exe\dll\lib\*.*" /> 
    </ItemGroup> 
    <Copy SourceFiles="@(LibFiles)" DestinationFolder="$(ReleasePath)\exe\dll\%(RecursiveDir)" /> 
    </Target> 

Wenn wir ItemGroup verwenden, um die Batch-Datei aus Ziel zu handhaben, wird MSBuild diese Dateien vorverarbeitet. Wenn wir unsere MSBuild-Skripte ausführen, werden die Ziele unzip und Copy in einer sehr kurzen Zeit abgeschlossen sein, jedoch wird die tatsächliche Fertigstellung des unzip ein paar Sekunden Verzögerung sein. Daher wird das CopyFiles-Ziel tatsächlich ausgeführt. Die Kopieraufgabe kopiert die Dateien jedoch nicht (weil das Entpacken noch nicht abgeschlossen ist). Dies ist der Grund, warum die Kopieraufgabe nicht zum ersten Mal ausgeführt, sondern zum zweiten Mal ausgeführt wurde.

Also, um dieses Problem zu lösen, müssen Sie nur schreiben ItemGroup innerhalb Kopie Ziel.

+0

Funktioniert jetzt. Vielen Dank. Ich dachte daran, eine Sleep- oder Thread-Aufgabe zu verwenden, aber das ist viel besser. Kennen Sie einen Link, der das Konzept einer ItemGroup in einem Ziel erklärt?Ich verstehe nicht genau, wie das Hinzufügen des innerhalb des Kopierziels eine Verzögerung erzwingt. – rds80

+0

Bevor ich diese Frage beantworte, habe ich versucht, die relevanten Dokumente über den Unterschied zwischen ItemGroup innerhalb des Ziels und außerhalb des Ziels zu finden, leider habe ich kein Dokument gefunden, um das Problem zu veranschaulichen. Wenn ich später die relevanten Dokumente gefunden habe, werde ich es Ihnen mitteilen. –

Verwandte Themen