web-dev-qa-db-de.com

MSBuild Task-Syntax zum Löschen von Dateien

Ich versuche, einen MSBuild-Task zu schreiben, der das Obj-Verzeichnis und die PDBs aus meinem bin-Ordner in meinen Produktionserstellungsskripten löscht und anscheinend nicht funktioniert.

Hat jemand ein Beispiel, wo sie dies oder ähnliches tun, oder einen Link zu einem einfachen Beispiel zum Entfernen von Dateien und einem Verzeichnis mit MSBuild?

69
Chris Marisic

Wenn Sie ein gesamtes Verzeichnis löschen möchten, benötigen Sie die Aufgabe RemoveDir :

<RemoveDir Directories="Path/To/Obj" />

Und wenn Sie die PDB-Dateien aus dem Papierkorb löschen möchten, müssen Sie die Aufgabe Löschen ausführen:

<Delete Files="Path/To/Bin/MyApp.pdb" />

Beachten Sie, dass Sie in der Löschaufgabe keine Platzhalter verwenden können. Wenn Sie also mehrere pdb-Dateien haben, müssen Sie als Argument ItemGroup angeben.

90
Gavin Miller

Sie können die Dateien in diesen Verzeichnissen zuerst löschen und dann das Verzeichnis selbst mit

<Target Name="SomeTarget">
    <ItemGroup>
        <FilesToDelete Include="Path\To\Obj\**\*"/>
    </ItemGroup>   
    <Delete Files="@(FilesToDelete)" />   
    <RemoveDir Directories="Path\To\Obj\" />
</Target>
120

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 werden, wenn MSBuild die neueste Version von TFS erhält. 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 &quot;@(FileToDelete)&quot;"/>
17
Garry English

Die geposteten Antworten funktionieren so lange, wie Sie sich mit einem einzelnen Verzeichnis befassen müssen. Wenn Sie verschachtelte Ordner haben, schlägt RemoveDir mit dem Fehler Directory not empty Fehl.

Ein etwas generischer Ansatz berücksichtigt auch verschachtelte Ordner:

<Target Name="CleanOutDir">
    <ItemGroup>
        <FilesToClean Include="$(OutDir)\**\*.*" />

        <!-- Bit of .Net to get all folders and subfolders -->
        <FoldersToClean Include="$([System.IO.Directory]::GetDirectories(&quot;$(OutDir)&quot;))" />
    </ItemGroup>

    <Delete Files="@(FilesToClean)"/>
    <RemoveDir Directories="@(FoldersToClean)" />
</Target>
7
Mrchief

Dieser Code ist so hässlich, dass er mit einer Airsickness-Tasche 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 &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
</Target>

Wie viele RmDir-Befehle werden benötigt? Genug, damit ein paar 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 beeinflussen, so wie es gelegentlich Subversion tut, aber ich hätte lieber einen umfassenden AV-Schutz, als eine Ausschlussliste (falsch) zu verwalten.

5
Mark Jerde

Es ist auch möglich, zuerst die schreibgeschützte Eigenschaft aus der Datei zu entfernen und die Löschtask msbuild auszuführen.

Wie so:

<Target Name="DeleteFiles">
 <Message Text="Delete File" Importance="high"/>
 <Attrib Files="$(FileToDelete)" ReadOnly="false" />
 <Delete Files="$(FileToDelete)" />
</Target>`
4
Ole

Fügen Sie dies in Visual Studio 2013 am Ende meiner .csproj-Datei kurz vor dem schließenden Tag </Project> 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) dem obj-Ordner erneut DesignTimeResolveAssemblyReferencesInput.cache Und den aktuellen \bin Ordner (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 mehrere Konfigurationen stapelweise neu erstellen, da alle vorherigen Bemühungen bei jeder Neuerstellung gelöscht werden und nur die letzte zurückbleibt. Whups.

2
CAD bloke

Nur um noch eine Falte hinzuzufügen, die ich entdeckt habe. Ich verwende Visual Studio 2015. Die über Wildcard gelöschten Antworten sind für mich immer noch problematisch. Ich vermute, dass die Platzhalter vor dem Build ausgewertet werden, nicht nach. Das bedeutet, dass die Löschvorgänge nicht stattfinden, 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 jedes zweite Mal funktioniert, wenn Sie es erstellen, was das Testen sehr angenehm macht.

Ich gebe auf Wildcards auf. Für das, was ich tue, kenne ich die Dateien, die Probleme verursachen, und ich codiere die tatsächlichen Dateinamen hart (wenn dies in einer Projektdatei so genannt werden kann).

1
rrreee