【问题标题】:Need a "post clean event" in Visual Studio需要 Visual Studio 中的“清理后事件”
【发布时间】:2022-03-13 17:07:49
【问题描述】:

我得到了一个带有构建后事件的 VS 项目,该项目带有一个命令行命令,该命令将文件 (.dll) 复制到 bin 目标目录(调试或发布)。当我对项目进行“清理”时,所有东西都被清理了,但这个文件仍然存在。有没有办法发布清理后事件,以便我也可以删除此文件?

【问题讨论】:

标签: visual-studio visual-studio-2010


【解决方案1】:

您可以直接编辑项目文件并将目标添加到文件末尾。 BeforeCleanAfterClean 是此处解释的目标:

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

您应该能够在目标中放置一个删除任务。

编辑 刚刚测试了这个(右键项目->卸载->右键->编辑),下面的目标就是你需要的:

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

这在您清理项目而不是解决方案时有效 - 它有效但不是 100%。

【讨论】:

  • 如果您使用 gulp 并创建了一个干净的任务,那么只需输入 &lt;Exec Command="gulp clean" /&gt; 而不是 &lt;Delete Files="$(TargetDir)\*.txt" /&gt;
  • 如果我使用Target Name="AfterClean" 它不起作用。任何其他自定义名称都会这样做..
  • 在删除文件命令中直接使用通配符表达式不起作用。您需要先定义一个 ItemGroup。查看其他答案。
【解决方案2】:

@scrat789 关于AfterTargets的提示。

对于 VS 2017,v15.6.0 Preview 2.0,我最终得到以下结果:

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

一些事情:

  • 请注意,我使用的是唯一的目标名称 MyDistClean。指定名称 AfterClean 无效。
  • 编辑后无需重新加载 csproj 即可运行/测试 Clean 任务。
  • 消息重要性设置为 high 以避免更改此处提到的 MSBuild 详细级别:AfterClean Target Doesn't Get Invoked When I Clean The Project
  • MyDistClean 任务已在解决方案和项目范围内处理。

以下是改进后的任务,以在 Clean 时删除 webpack dist 目录:

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

【讨论】:

  • 名字是我的问题! AfterClean 确实不起作用。谢谢。
  • 截至 2020 年 6 月和 Microsoft Visual Studio 2019 版本 16.6.3 this 方法是可行的。当您使用 Target Name=Clean、AfterClean 或 BeforeClean 中的任何一个时,它不会飞行。您必须对您命名的目标使用 AfterTargets=Clean 属性,该目标的名称不在docs.microsoft.com/en-us/visualstudio/msbuild/…显示的保留列表中@
【解决方案3】:

我发现 Leom Burke 使用“删除文件”的回答不适用于通配符,也没有告诉您出现任何问题。这就是我所做的 -

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

我编写以上内容是为了删除 umbraco 解决方案中的文件,这样当我对源代码控制中的内容进行比较时,它不会让我感到困惑。

【讨论】:

  • MSBuild 有 Delete 任务时为什么会退出进程?
  • 不久前我回答了这个问题,但正如我所提到的,它不适用于通配符。
【解决方案4】:

您可以使用内置的删除功能来做通配符。

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

【讨论】:

  • 这是最优雅的解决方案。不过,请注意您使用的是哪个版本的 MSBuild。旧版本将在加载文档时处理 ItemGroup,竞争条件可能导致您的文件未被枚举和删除。
  • MS让你这样做的原因是explained here
【解决方案5】:

我认为 Visual Studio 2017 发生了一些变化。

适用于标签:AfterTargets="Clean"

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

【讨论】:

  • 查看我关于目标名称的相关回答。
【解决方案6】:

您可以更新 csproj 文件以指定新目标。您必须在文本编辑器中进行此操作。

在此处查看文档:How to: Extend the Visual Studio Build Process

您将不得不特别更改&lt;Target name='AfterClean'&gt;

【讨论】:

    【解决方案7】:

    继续其他人的提示 - 希望这也会有所帮助(我花了一些时间来弄清楚),不能在下面的代码中加粗,所以请注意 $(APPDATA) 部分..

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

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      相关资源
      最近更新 更多