msbuild msbuild-task

Sintaxis de MSBuild Task para eliminar archivos



msbuild-task (8)

En Visual Studio 2013, agregué esto al final de mi archivo .csproj justo antes de la etiqueta de cierre de </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 funcionar, pero me di cuenta de 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 construye en diferentes subcarpetas en /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 borra todos los esfuerzos previos en cada reconstrucción, dejándolo solo con la última. Whups.

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

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


Este código es tan feo que debería venir con una bolsa de mareo. ;-) Pero es rápido porque no crea una lista de archivos para 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 comandos RmDir se necesitan? 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.


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

Un enfoque ligeramente genérico también se ocupa de las carpetas anidadas:

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


Primero puede eliminar los archivos en esos directorios y luego el propio directorio con

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


Publicar para otros que podrían haber encontrado el mismo problema que estaba teniendo.

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

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


Si está buscando eliminar un directorio completo, necesita la tarea RemoveDir :

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

Y si quiere eliminar los archivos PDB de la papelera, 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.


Solo para agregar 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 construcción, no después . 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.


También es posible eliminar primero la propiedad readonly del archivo y ejecutar la tarea de eliminación de msbuild.

Al igual que:

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