2011-02-24 15 views
14

Obtuve un proyecto VS con un evento posterior a la construcción con un comando de línea de comandos que copia un archivo (.dll) en el directorio bin destino (depuración o versión). Cuando hago un "Limpiar" en el proyecto, todo se limpia, pero este archivo permanece. ¿Hay alguna manera de publicar eventos posteriores a la publicación para que también pueda eliminar este archivo?Necesito un "evento posterior a la limpieza" en Visual Studio

Respuesta

15

Puede editar el archivo de proyecto directamente y agregar el destino al final del archivo. BeforeClean y AfterClean son blancos como se explica aquí:

http://blogs.msdn.com/b/msbuild/archive/2005/11/23/496396.aspx

usted debería ser capaz de poner una tarea Eliminar en el objetivo.

EDITAR Simplemente probado este (proyecto del botón derecho -> descarga -> clic derecho -> editar) y el siguiente objetivo es lo que necesita:

<Target Name="AfterClean"> 
    <Delete Files="$(TargetDir)\*.txt" /> 
</Target> 

Esto funciona cuando se limpia el proyecto pero no la solución, funciona pero no al 100%.

+0

Si está utilizando trago y se creó una tarea de limpieza a continuación, sólo hay que poner '' en lugar de ''. – christo8989

1

Puede actualizar el archivo csproj para especificar un nuevo objetivo. Tendrás que hacer esto en un editor de texto.

Eche un vistazo a la documentación aquí: How to: Extend the Visual Studio Build Process.

Tendrá especial para cambiar la <Target name='AfterClean'>

9

que he encontrado que la respuesta de Leom Burke usando "Eliminar archivos" no funciona con comodines y no te dice que algo iba mal. Esto es lo que he hecho en su lugar -

<Target Name="BeforeClean"> 
     <Message Text="Cleaning other files..."/> 
     <Exec Command="del $(ProjectDir)css\*.* /F /Q"/> 
     <Exec Command="del $(ProjectDir)images\*.* /F /Q" /> 
     <Exec Command="del $(ProjectDir)js\*.* /F /Q" /> 
     <Exec Command="del $(ProjectDir)usercontrols\*.* /F /Q" /> 
     <Exec Command="del $(ProjectDir)MasterPages\*.* /F /Q" /> 
     <Exec Command="del $(ProjectDir)App_Data\TEMP\*.* /F /Q /S" /> 
     <Exec Command="del $(ProjectDir)App_Data\Logs\*.* /F /Q /S" /> 
    </Target> 

escribí lo anterior para eliminar archivos en una solución umbraco para que cuando hago un diff con lo que está en control de código fuente, no confundir los mocos de mí.

+0

¿Por qué salir del proceso cuando MSBuild tiene una tarea de eliminación? –

+0

Hace un tiempo cuando respondí esto, pero como mencioné, no funcionaba con comodines. –

7

Sé que este es un tema antiguo, pero puede hacer comodines con la función integrada incorporada.

<Target Name="AfterClean"> 
    <ItemGroup> 
     <FilesToDelete Include="$(TargetDir)\*.txt"/> 
    </ItemGroup> 
    <Delete Files="@(FilesToDelete)" /> 
</Target> 
+0

Esta es la solución más elegante. Pero mira en qué versión de MSBuild estás. Las versiones anteriores procesarán el ItemGroup cuando se cargue el documento y las condiciones de carrera pueden provocar que sus archivos no se enumeren ni eliminen. –

0

creo que algo cambie con Visual Studio 2017.

Obras con la etiqueta: AfterTargets = "limpio"

<Target Name="AfterClean" AfterTargets="Clean"> 
    <!-- Remove bin folder --> 
    <RemoveDir Directories="$(TargetDir)" /> 
    <!-- Remove obj folder --> 
    <RemoveDir Directories="$(ProjectDir)$(BaseIntermediateOutputPath)" /> 
</Target> 
+0

Ver mi respuesta relacionada con el nombre del objetivo. – bvj

0

Sombrero de punta a @ scrat789 respecto AfterTargets.

para VS 2017, v15.6.0 Vista preliminar 2.0, que terminó con las siguientes:

<Target Name="MyDistClean" AfterTargets="Clean"> 
    <Message Text="Deleting wwwroot\dist files" Importance="high" /> 
    <Delete Files="$(ProjectDir)\wwwroot\dist\*.*" ContinueOnError="true" /> 
    </Target> 

algunas cosas:

  • Aviso estoy usando un nombre de destino único, MyDistClean. Especificar el nombre, AfterClean, no funcionó.
  • No fue necesario volver a cargar el csproj después de la edición para ejecutar/probar la tarea de limpieza.
  • importancia del mensaje se establece alta para evitar cambiar el nivel de verbosidad MSBuild mencionado aquí en SO: AfterClean Target Doesn't Get Invoked When I Clean The Project
  • MyDistClean tarea se procesó a la solución y alcance del proyecto.

Ésta es la tarea de mejora de borrar el directorio webpack dist sobre Clean:

<Target Name="MyDistClean" AfterTargets="Clean"> 
    <ItemGroup> 
     <DistDir Include="$(ProjectDir)wwwroot\dist" /> 
    </ItemGroup> 
    <Message Text="Deleting @(DistDir)" Importance="high" /> 
    <RemoveDir Directories="@(DistDir)" /> 
    </Target> 
Cuestiones relacionadas