2009-09-25 10 views
61

Próbuję napisać zadanie MSBuild, które usuwa katalog Obj i PDB z mojego folderu bin na moich skryptach budowania produkcji i wydaje się, że nie działa poprawnie.MSBuild Składnia zadań do usuwania plików

Czy ktoś ma przykład, gdzie robią to lub podobne, lub łącze do prostego przykładu usuwania plików i katalogu z MSBuild?

Odpowiedz

81

Jeśli szukasz, aby usunąć cały katalog można wymagać zadanie RemoveDir:

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

A jeśli chce usunąć pliki PDB z kosza będziemy chcieli zadanie Delete:

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

Należy zauważyć, że nie można używać symboli wieloznacznych w zadaniu Usuwanie, więc w przypadku wielu plików pdb należy podać argument jako ItemGroup.

+0

Czy katalog usuwania zostanie usunięty z plików? –

+7

Strona odniesienia zadania * RemoveDir * (patrz wyżej) mówi, że wszystkie pliki i podkatalogi zostaną usunięte. – Yawar

+0

Chciałbym móc zaznaczyć obie twoje odpowiedzi, ponieważ link do zadania RemoveDir pokazał mi, czego tak naprawdę brakowało, że nie wyłączyłem mojej właściwości OutputPath w celu znalezienia właściwego katalogu. Odpowiedź Sayeds ze składnią ItemGroup była tym, co musiałem zrobić, aby pobrać wszystkie pdb, aby je usunąć. Dziękuję wam obu! –

110

można usunąć pliki w tych katalogach, a potem samego katalogu z

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

To bardzo mi pomogło dzięki! Niestety nie mogłem oznaczyć obydwu odpowiedzi w rozwiązaniu, dodałem trochę więcej w powyższym komentarzu. –

+0

Nie działa dla mnie na VS2010SP1 – pylover

+0

@pylover popełniłeś błąd na końcu, powyższy kod działa. –

4

ten kod jest tak brzydki, to musi przyjść z worka airsickness. ;-) Ale jest szybki, ponieważ nie tworzy listy plików do usunięcia itp.

<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> 

Ile poleceń RmDir jest potrzebnych? Wystarczająco dużo, więc kilka poleceń RmDir zwraca "System nie może znaleźć określonego pliku" zamiast "Katalog nie jest pusty." Na moim komputerze wydaje się, że bierze inny RmDir, jeśli $ (BuildFolder) jest otwarty w Eksploratorze Windows. Program antywirusowy może wpływać na RmDir, tak jak czasami robi Subversion, ale wolałbym mieć ochronę zbiorczą AV niż (nie) zarządzać listą wykluczeń.

16

Publikowanie postów dla osób, które mogły mieć ten sam problem, który miałem.

Zadanie Usuń nie może usuwać plików tylko do odczytu, co było mi potrzebne, tak jak wtedy, gdy MSBuild pobiera najnowsze z TFS, pliki są oznaczone jako readonly. Użyłem polecenia EXEC, aby usunąć tylko do odczytu plików:

<ItemGroup> 
    <FileToDelete Include="c:\temp\fileToDelete.txt"/> 
</ItemGroup> 
<Exec Command="del /F /Q &quot;@(FileToDelete)&quot;"/> 
+0

Jest to jedyna rzecz, która będzie działać dla mnie, gdy pliki będą tylko do odczytu! (np. wyrejestrowany z TFS) :) Dzięki. –

+0

Posiadałem ItemGroup z symbolami wieloznacznymi rozszerzonymi na tak wiele plików (pełne ścieżki), że linia poleceń 'del' stała się zbyt długa. Moim rozwiązaniem było przekazanie symboli wieloznacznych bezpośrednio do 'del', zamiast korzystania z ItemGroup. – yoyo

3

Jest również możliwe, aby najpierw usunąć właściwość tylko do odczytu z pliku i wykonać MSBuild usunąć zadanie.

tak:

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

Wygląda na to, że zadanie Attrib, o którym tutaj mowa, jest częścią projektu [MSBuild Community Tasks] (https://github.com/loresoft/msbuildtasks). –

2

W Visual Studio 2013, dodał to do końca mojego pliku .csproj tuż przed zamknięciem </Project> tag

<Target Name = "clean_folders" AfterTargets="Clean"> 
<Exec Command = "rd /S /Q obj" /> 
<Exec Command = "rd /S /Q bin" /> 
</Target> 

Na początku nie wydaje się to praca, ale zauważyłem, że Visual Studio (lub R #, nie jestem pewien) ponownie dodany DesignTimeResolveAssemblyReferencesInput.cache do folderu obj, a także ponownie dodano bieżący folder \bin (Mam różne kompilacje w różnych podfolderach pod \bin). Oczyścił wszystko inne, łącznie z 25 innymi konfiguracjami kompilacji, które mam z zaimportowanych plików .csproj (tak, wiem).

Należy zachować ostrożność, jeśli Przetwarzanie wsadowe przebudowuje więcej niż jedną konfigurację, ponieważ po prostu usuwa wszystkie poprzednie wysiłki przy każdej przebudowie, pozostawiając tylko ostatnią. Whups.

3

Zamieszczone odpowiedzi będą działać tak długo, jak długo będziesz mieć do czynienia z pojedynczym katalogiem. Jeśli masz foldery zagnieżdżone, RemoveDir zakończy się niepowodzeniem z błędem Directory not empty.

Nieco ogólne podejście zajmuje zagnieżdżonych folderów, a także:

<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> 
1

Wystarczy dodać jeszcze jedną zmarszczkę że odkryłam. Używam programu Visual Studio 2015. Zamieszczone odpowiedzi, które są usuwane za pośrednictwem wieloznacznika, nadal są dla mnie kłopotliwe. Podejrzeń, że symbole wieloznaczne są oceniane przed kompilacją, a nie po. Oznacza to, że usunięcie nie nastąpi, jeśli pliki, które chcesz usunąć, zostaną utworzone podczas kompilacji. Prowadzi to również do wspaniałego zachowania, w którym usuwanie działa co drugi raz, co sprawia, że ​​testowanie jest bardzo przyjemne.

Podaję się symboli wieloznacznych. Dla tego, co robię, znam pliki, które powodują problemy i jestem trudnym kodowaniem (jeśli można to nazwać w pliku projektu) rzeczywistymi nazwami plików.

+0

Jeśli grupa przedmiotów używająca symboli wieloznacznych znajduje się wewnątrz obiektu docelowego, powinna być oceniana za każdym razem, gdy wykonywany jest cel. ItemGroups na poziomie projektu są rzeczywiście oceniane podczas wykonywania Projektu. – Zastai

Powiązane problemy