开发者

Need a "post clean event" in Visual Studio

I got a VS project with a post-build event with a command-line command that copies a file (.dll) to the bin target dir (debug or release). When I do a "Clean" on the project 开发者_运维技巧every thing is cleaned, but this file remains. Is there a way to ad post-clean events so I can delete this file also?


You can edit the project file directly and add the target to the end of the file. BeforeClean and AfterClean are targets as explained here:

https://learn.microsoft.com/en-us/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process?view=vs-2019

You should be able to put a Delete task in the target.

EDIT Just tested this (right-click project -> unload -> right click -> edit) and the following target is what you need:

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

This works when you clean the project but not the solution - it works but not 100%.


Hat tip to @scrat789 regarding AfterTargets.

For VS 2017, v15.6.0 Preview 2.0, I ended up with the following:

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

A few things:

  • Notice I'm using a unique target name, MyDistClean. Specifying the name, AfterClean, did not work.
  • It wasn't necessary to reload the csproj after editing in order to run/test the Clean task.
  • Message importance is set high to avoid changing the MSBuild verbosity level mentioned here at SO: AfterClean Target Doesn't Get Invoked When I Clean The Project
  • MyDistClean task was processed at both the solution and project scope.

Here's the task improved to obliterate the webpack dist directory upon Clean:

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


I've found that Leom Burke's answer using "Delete Files" doesn't work with wildcards and doesn't tell you that anything went wrong. Here's what i've done instead -

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

I wrote the above to remove files in an umbraco solution so that when i do a diff with what's in source control, it doesn't confuse the snot out of me.


You can do wildcards using built in Delete function.

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


I think something changes with Visual Studio 2017.

Works with tag : AfterTargets="Clean"

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


You can update the csproj file to specify a new target. You will have to this in a text editor.

Take a look at the documentation here : How to: Extend the Visual Studio Build Process.

You will have especially to change the <Target name='AfterClean'>


In continuation to other's tips - hope this will help also (took me some time to figure), can't bold in the code below, so notice the $(APPDATA) part..

...
    <Target Name="MyDistClean" AfterTargets="Clean">
        <ItemGroup>
            <DistDir Include="$(APPDATA)\MyApp\Configuration\" />
        </ItemGroup>
        <Message Text="Deleting @(DistDir)" Importance="high" />
        <RemoveDir Directories="@(DistDir)" />
    </Target>
</Project>


Accepted answer did not work for me on Visual Studio 2022. Instead edit the project properties in Visual Studio:

  1. Right click on the project in VS
  2. Properties
  3. Configuration Properties, Advanced
  4. Extensions to delete on Clear: (example entry) $(SolutionDir)cmpdata\Output\$(Configuration)\$(Platform)\zdcom.dll;$(ExtensionsToDeleteOnClean)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜