2009-09-25 12 views
61

Estoy tratando de escribir una tarea de MSBuild que elimine el directorio Obj y los PDB de mi carpeta bin en mis scripts de compilación de producción y parece que no funciona correctamente.MSBuild Sintaxis de tarea para eliminar archivos

¿Alguien tiene un ejemplo donde lo hacen o similar, o un enlace a un ejemplo simple de eliminación de archivos y un directorio con MSBuild?

Respuesta

81

Si usted está buscando para borrar un directorio completo se necesita el RemoveDir tarea:

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

Y si usted está queriendo borrar los archivos PDB de bin querrá la tarea Delete:

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

Tenga en cuenta que no puede usar comodines en la tarea Eliminar, por lo que si tiene varios archivos pdb, debe proporcionar un ItemGroup como argumento.

+0

¿Funcionará el directorio remove con los archivos que contiene? –

+7

La página de referencia de tareas * RemoveDir * (ver arriba) dice que se borrarán todos los archivos y subdirectorios. – Yawar

+0

Desearía poder marcar ambas respuestas porque el enlace a la tarea RemoveDir me mostró lo que realmente faltaba si no desreferenciaba mi propiedad OutputPath para encontrar el directorio correcto. La respuesta de Sayeds con la sintaxis de ItemGroup fue lo que tuve que hacer para obtener todos los pdb para eliminarlos. ¡Gracias a los dos! –

110

Puede borrar los archivos en esos directorios primero y luego el propio dir con

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

¡Esto me ayudó mucho gracias! Lamento no poder marcar ambas respuestas en la solución, agregué algunas más en mi comentario anterior. –

+0

No funciona para mí en VS2010SP1 – pylover

+0

@pylover ha cometido un error al final, el código anterior funciona. –

4

Este código es tan feo que debe venir con una bolsa para el mareo. ;-) Pero es rápido, ya que no construye una lista de archivos que desea eliminar, etc.

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

¿Cuántos se necesitan comandos RmDir? Suficiente para que algunos comandos de RmDir devuelvan "El sistema no puede encontrar el archivo especificado" en lugar de "El directorio no está vacío". En mi máquina parece tomar otro RmDir si $ (BuildFolder) está abierto en el Explorador de Windows. El programa antivirus puede afectar a RmDir como ocasionalmente lo hace Subversion, pero prefiero tener protección antivirus general que (mal) administrar una lista de exclusión.

16

Publicación para otros que podrían haberse encontrado con el mismo problema que estaba teniendo.

La tarea Eliminar no puede eliminar archivos de solo lectura, lo que necesitaba poder hacer, ya que cuando MSBuild obtiene lo último de TFS, los archivos se marcan como de solo lectura. He utilizado el comando EXEC para eliminar los archivos de sólo lectura:

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

¡Esto es lo único que funcionaría para mí cuando los archivos sean de solo lectura! (por ejemplo, retirado de TFS) :) Gracias. –

+0

Tenía un ItemGroup con comodines que se expandieron a tantos archivos (rutas completas) que la línea de comando 'del' se hizo demasiado larga. Mi solución fue pasar los comodines directamente a 'del' en lugar de usar un ItemGroup. – yoyo

3

También es posible quitar primero la propiedad de sólo lectura del archivo y para ejecutar la tarea msbuild eliminar.

así:

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

Parece que la tarea Attrib a la que se hace referencia aquí es parte del proyecto [Tareas de comunidad de MSBuild] (https://github.com/loresoft/msbuildtasks). –

2

En Visual Studio 2013, añadido esto al final de mi archivo .csproj justo antes de la etiqueta de cierre </Project>

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

Al principio no parecía pero noté que Visual Studio (o R #, no estoy seguro) volvió a agregar DesignTimeResolveAssemblyReferencesInput.cache a la carpeta obj y también volvió a agregar la carpeta actual \bin (tengo diferentes compilaciones en diferentes subcarpetas bajo \bin). Limpió todo lo demás, incluidas las otras 25 configuraciones de compilación que tengo de archivos .csproj importados (sí, lo sé).

Tenga cuidado si Batch Reconstruye más de una configuración, ya que simplemente borra todos los esfuerzos previos en cada reconstrucción y le deja solo la última. Whups.

3

Las respuestas publicadas funcionarán siempre que tenga que tratar con un único directorio. Si tiene carpetas anidadas, RemoveDir fallará con el error Directory not empty.

Un enfoque ligeramente genérica se encarga de carpetas anidadas así:

<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

sólo para añadir una arruga más que he descubierto. Estoy usando Visual Studio 2015. Las respuestas publicadas que se eliminan mediante comodines siguen siendo problemáticas para mí. Sospecho que los comodines se evalúan antes de la compilación, no después de. Eso significa que las eliminaciones no ocurrirán si los archivos que desea eliminar se crean durante la compilación. También lleva a un comportamiento maravilloso donde la eliminación funciona cada vez que compilas, lo que hace que sea muy agradable probarlo.

Estoy renunciando a los comodines. Por lo que estoy haciendo, sé los archivos que están causando problemas y estoy codificando (si puede llamarse así dentro de un archivo de proyecto) los nombres reales de los archivos.

+0

Si el ItemGroup que usa los comodines está dentro del Target, debe evaluarse cada vez que se ejecuta el Target. Los grupos de elementos en el nivel del proyecto se evalúan cuando se ejecuta el proyecto. – Zastai

Cuestiones relacionadas