2009-09-25 9 views
61

Sto provando a scrivere un'attività MSBuild che cancella la directory Obj ei PDB dalla mia cartella bin sugli script di produzione e non riesco a far funzionare correttamente.MSBuild Sintassi dell'attività per l'eliminazione dei file

Qualcuno ha un esempio in cui lo fa o simile o un collegamento a un semplice esempio di rimozione di file e una directory con MSBuild?

risposta

81

Se stai cercando di eliminare un'intera directory si richiede il compito RemoveDir:

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

E se hai intenzione di eliminare i file PDB da bin si vorrà il compito Delete:

Nota che non è possibile utilizzare i caratteri jolly nell'attività Elimina, quindi se si dispone di più file PDB, è necessario fornire un argomento come ItemGroup.

+0

La directory di rimozione funzionerà con i file al suo interno? –

+7

La pagina di riferimento dell'attività * RemoveDir * (vedere sopra) dice che tutti i file e le sottodirectory saranno cancellati. – Yawar

+0

Vorrei poter contrassegnare entrambe le risposte perché il collegamento all'attività RemoveDir mi ha mostrato che mancava davvero il fatto che non ho rimosso la proprietà OutputPath per trovare la directory corretta. La risposta di Sayeds con la sintassi ItemGroup era ciò che dovevo fare per prendere tutti i pdb per cancellarli. Grazie ad entrambi! –

110

è possibile eliminare i file in queste directory e poi il dir se stesso con

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

Questo mi ha aiutato, grazie mille! Scusa se non ho potuto contrassegnare entrambe le risposte alla soluzione, ne ho aggiunto altre nel mio commento sopra. –

+0

Non funziona per me su VS2010SP1 – pylover

+0

@pylover hai fatto qualche errore sul tuo terminale, il codice sopra funziona. –

4

Questo codice è così brutto dovrebbe venire con un sacchetto mal d'aria. ;-) Ma è veloce perché non costruire una lista di file da eliminare, ecc

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

Quanti sono necessari comandi RmDir? Basta che alcuni comandi RmDir restituiscano "Il sistema non riesce a trovare il file specificato" invece di "La directory non è vuota". Sulla mia macchina sembra prendere un altro RmDir se $ (BuildFolder) è aperto in Windows Explorer. Il programma antivirus può influenzare RmDir come occasionalmente fa Subversion, ma preferirei avere una protezione AV coperta che (mal) gestire un elenco di esclusione.

16

Pubblicare per altri che potrebbero aver incontrato lo stesso problema che stavo avendo.

L'attività Elimina non può eliminare i file di sola lettura, che dovevo essere in grado di fare, poiché quando MSBuild viene aggiornato da TFS, i file sono contrassegnati come readonly. Ho usato il comando exec per eliminare i file di sola lettura:

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

Questa è l'unica cosa che potrebbe funzionare per me quando i file sono di sola lettura! (ad esempio, verificato da TFS) :) Grazie. –

+0

Ho avuto un gruppo oggetti con caratteri jolly che si espandeva in così tanti file (percorsi completi) che la riga di comando 'del' è diventata troppo lunga. La mia soluzione era passare i caratteri jolly a 'del' direttamente piuttosto che usare un ItemGroup. – yoyo

3

E 'anche possibile rimuovere prima la proprietà di sola lettura dal file e di eseguire il msbuild Elimina attività.

Come così:

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

Sembra che l'attività Attrib referenziata qui faccia parte del progetto [Attività della community di MSBuild] (https://github.com/loresoft/msbuildtasks). –

2

In Visual Studio 2013, ha aggiunto questo alla fine del mio file Csproj appena prima del tag di chiusura </Project>

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

In un primo momento non sembra lavoro, ma ho notato che Visual Studio (o R #, non è sicuro) ha aggiunto nuovamente DesignTimeResolveAssemblyReferencesInput.cache alla cartella obj e ha anche aggiunto la cartella corrente \bin (ho diverse build in diverse sottocartelle sotto \bin). Ha ripulito tutto il resto, incluse le altre 25 configurazioni di configurazione che ho da file .csproj importati (sì, lo so).

Fare attenzione se si raggruppa Ricreare più di una configurazione poiché cancella semplicemente tutti gli sforzi precedenti su ciascuna ricostruzione lasciandovi solo l'ultima. Whups.

3

Le risposte inviate funzioneranno finché si ha a che fare con una singola directory. Se ti capita di avere cartelle annidate, RemoveDir fallirà con l'errore Directory not empty.

Un approccio un po 'generica si prende cura di cartelle nidificate così:

<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

solo per aggiungere un altro antirughe che ho scoperto. Sto usando Visual Studio 2015. Le risposte postate che stanno cancellando tramite jolly sono ancora fastidiose per me. Sospetto che i caratteri jolly vengano valutati prima della creazione, non dopo. Ciò significa che le eliminazioni non si verificheranno se i file che si desidera eliminare vengono creati durante la generazione. Porta anche a comportamenti meravigliosi in cui l'eliminazione funziona ogni volta che si crea, il che rende tutto molto divertente da testare.

Sto rinunciando ai caratteri jolly. Per quello che sto facendo conosco i file che stanno causando problemi e sto hard-coding (se può essere chiamato all'interno di un file di progetto) i nomi dei file reali.

+0

Se l'ItemGroup che utilizza i caratteri jolly si trova all'interno della destinazione, deve essere valutato ogni volta che viene eseguita la destinazione. I gruppi di oggetti a livello di progetto vengono effettivamente valutati quando viene eseguito il progetto. – Zastai

Problemi correlati