Ich versuche, eine MSBuild-Aufgabe zu schreiben, die das Obj-Verzeichnis und die PDBs aus meinem bin-Ordner in meinen Produktionserstellungsskripten löscht und anscheinend nicht richtig funktioniert.
Hat jemand ein Beispiel, wo er dies oder ähnliches tut, oder einen Link zu einem einfachen Beispiel zum Entfernen von Dateien und einem Verzeichnis mit MSBuild?
msbuild
msbuild-task
Chris Marisic
quelle
quelle
ContinueOnError="true"
Attribut für den ersten Wiederaufbau<Delete Files=...>
Aufgabe gespielt und festgestellt, dass beim Erstellen von Visual Studio die Dateien gelöscht werden und ich diese Informationen in der Ausgabe sehe. Aber wenn ich es ausführe, hat es eine msbuild-Befehlszeile, die Dateien werden nicht gelöscht und ich sehe nichts darüber in der Ausgabe, unabhängig von der Ausführlichkeit.Sie können zuerst die Dateien in diesen Verzeichnissen und dann das Verzeichnis selbst mit löschen
<Target Name="SomeTarget"> <ItemGroup> <FilesToDelete Include="Path\To\Obj\**\*"/> </ItemGroup> <Delete Files="@(FilesToDelete)" /> <RemoveDir Directories="Path\To\Obj\" /> </Target>
quelle
Posting für andere, die möglicherweise auf das gleiche Problem gestoßen sind, das ich hatte.
Die Aufgabe Löschen kann keine schreibgeschützten Dateien löschen, was ich tun musste, da die Dateien als schreibgeschützt markiert sind, wenn MSBuild von TFS auf den neuesten Stand gebracht wird. Ich habe den EXEC-Befehl verwendet, um schreibgeschützte Dateien zu löschen:
<ItemGroup> <FileToDelete Include="c:\temp\fileToDelete.txt"/> </ItemGroup> <Exec Command="del /F /Q "@(FileToDelete)""/>
quelle
del
Befehlszeile zu lang wurde. Meine Lösung bestand darin, die Platzhalterdel
direkt an eine ItemGroup zu übergeben, anstatt sie zu verwenden.Die veröffentlichten Antworten funktionieren so lange, wie Sie sich mit einem einzelnen Verzeichnis befassen müssen. Wenn Sie verschachtelte Ordner haben,
RemoveDir
schlägt dies mit einemDirectory not empty
Fehler fehl .Ein leicht generischer Ansatz kümmert sich auch um verschachtelte Ordner:
<Target Name="CleanOutDir"> <ItemGroup> <FilesToClean Include="$(OutDir)\**\*.*" /> <!-- Bit of .Net to get all folders and subfolders --> <FoldersToClean Include="$([System.IO.Directory]::GetDirectories("$(OutDir)"))" /> </ItemGroup> <Delete Files="@(FilesToClean)"/> <RemoveDir Directories="@(FoldersToClean)" /> </Target>
quelle
Dieser Code ist so hässlich, dass er mit einem Airsickness-Beutel geliefert werden sollte. ;-) Aber es ist schnell, weil es keine Liste der zu löschenden Dateien usw. erstellt.
<Target Name="DeleteBuildFolder"> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> </Target>
Wie viele RmDir-Befehle werden benötigt? Genug, damit einige RmDir-Befehle "Das System kann die angegebene Datei nicht finden" anstelle von "Das Verzeichnis ist nicht leer" zurückgeben. Auf meinem Computer scheint ein anderes RmDir erforderlich zu sein, wenn $ (BuildFolder) im Windows Explorer geöffnet ist. Das Antivirenprogramm kann RmDir wie gelegentlich Subversion betreffen, aber ich hätte lieber einen umfassenden AV-Schutz, als eine Ausschlussliste (falsch) zu verwalten.
quelle
Es ist auch möglich, zuerst die schreibgeschützte Eigenschaft aus der Datei zu entfernen und die msbuild-Löschaufgabe auszuführen.
Wie so:
<Target Name="DeleteFiles"> <Message Text="Delete File" Importance="high"/> <Attrib Files="$(FileToDelete)" ReadOnly="false" /> <Delete Files="$(FileToDelete)" /> </Target>`
quelle
Fügen Sie dies in Visual Studio 2013 am Ende meiner .csproj-Datei kurz vor dem
</Project>
schließenden Tag hinzu<Target Name = "clean_folders" AfterTargets="Clean"> <Exec Command = "rd /S /Q obj" /> <Exec Command = "rd /S /Q bin" /> </Target>
Zuerst schien es nicht zu funktionieren, aber ich bemerkte, dass Visual Studio (oder R #, nicht sicher) erneut
DesignTimeResolveAssemblyReferencesInput.cache
zum obj-Ordner und der aktuelle\bin
Ordner hinzugefügt wurde (ich habe verschiedene Builds in verschiedenen Unterordnern unter\bin
). Es hat alles andere entfernt, einschließlich der 25 anderen Build-Konfigurationen, die ich aus importierten .csproj-Dateien habe (ja, ich weiß).Seien Sie vorsichtig, wenn Sie mehr als eine Konfiguration stapelweise neu erstellen, da nur alle vorherigen Bemühungen bei jeder Neuerstellung gelöscht werden und Sie nur die letzte haben. Whups.
quelle
Nur um noch eine Falte hinzuzufügen, die ich entdeckt habe. Ich verwende Visual Studio 2015. Die veröffentlichten Antworten, die per Platzhalter gelöscht werden, sind für mich immer noch problematisch. Ich vermute, dass die Platzhalter vor dem Build ausgewertet werden, nicht danach . Das bedeutet, dass das Löschen nicht erfolgt, wenn die zu löschenden Dateien während des Builds erstellt werden. Es führt auch zu einem wunderbaren Verhalten, bei dem das Löschen bei jeder zweiten Erstellung funktioniert, was das Testen sehr angenehm macht.
Ich gebe Platzhalter auf. Für das, was ich tue, kenne ich die Dateien, die Probleme verursachen, und ich codiere die tatsächlichen Dateinamen fest (wenn man das innerhalb einer Projektdatei so nennen kann).
quelle