如何在Visual Studio 2008中创建自定义的清理(清理后)事件?

23

在我们的构建过程中,为了每个项目,我们使用Post Build事件将可执行文件复制到单独的部署目录中。这很好用,但问题是在执行“Clean Solution/Clean Project”操作之后,我们遇到了过时的文件问题。我想设置一个“清除”事件来删除已复制的文件,但是Visual Studio 2008似乎在项目属性页面上没有提供此选项。

它有:

Build Events:
   Pre-Build Event
   Pre-Link Event
   Post-Build Event
Custom Build Step
   General

我希望找到一种在项目清理时执行任意命令行的方法。

6个回答

42

你可以在csproj文件中使用MSBuild目标语法。

例如:

  <Target Name="AfterClean">
    <Delete Files="$(OutDir)\$(TargetName).exe" ContinueOnError="true" />
  </Target>

在Visual Studio IDE中,有一种简便的编辑.csproj文件的方法,可以通过MSBuild团队博客中描述的方式实现,但这是我的第一篇帖子,所以我只能包含一个超链接。 简要地说:卸载项目,然后右键单击它,查看“编辑[project].csproj”条目,您的csproj将作为xml文件在IDE中显示,并带有元素和属性的智能感知功能。太棒了!

完整的自定义目标列表在此处


1
附注:也可以在记事本中编辑.csproj文件,然后保存,Visual Studio会检测到并重新加载项目。经过多次不断的尝试和错误,这样做会更快一些。但是没有智能感知功能。 - goodeye
4
该问题被标记为[c++]和[visual-c++],这意味着他有一个.vcproj文件而不是一个.csproj文件。这两种文件格式看起来是不同的。 - user1354557
上述链接似乎已经失效,且没有存档记录。不清楚原始链接具体内容,但是以下两个微软文档参考似乎列出了所有构建过程的目标: https://learn.microsoft.com/en-us/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process 和 https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-targets。 - Lovethenakedgun

9
对于Visual C++项目,您需要将文件添加到“常规”项目配置属性下的“清理时要删除的扩展名”部分。尽管它声称想要扩展名,但实际上它正在使用通配符,并且会愉快地接受完整路径并展开MSBuild变量。这对我有用:

$(ProjectDir)\deployment\*.*

我不确定是否可以以这种方式删除目录,但至少可以获取文件。

4
这对我来说行不通。我无法在使用VS 2012时指定完整路径或相对路径。 - garlix
一旦我意识到它是相对于中间目录的,所以必须使用$(OutDir)来删除输出目录中的文件,它就在Visual 2013 Express中运行成功了。 - A. Richard

4
如果您使用“项目属性 -> 配置属性 -> 自定义构建设置”,则必须记得填写“输出”字段,否则它将无法运行。

http://blogs.msdn.com/b/visualstudio/archive/2010/04/26/custom-build-steps-tools-and-events.aspx

“Outputs属性是一个以分号分隔的文件列表,必须列出在自定义构建步骤执行期间生成的任何文件。如果将Outputs属性留空,则您的自定义构建步骤将永远不会执行,因为MSBuild将确定没有输出过期。如果您的步骤不生成文件但仍希望每次都执行它,可以编造一个假文件名来实现,因为该文件永远不存在,MSBuild将始终确定自定义构建步骤已过期。”


2
你需要手动编辑 .csproj 文件并添加一个“AfterClean”目标。

Scott - 你能详细说明如何添加"AfterClean"目标吗? - Marc
你是指 .vsproj 吗,而不是 .csproj 吗? - Marc

1

很遗憾,没有记录的方法可以插入自定义清理步骤。您可以在预构建事件中清理输出,但这仍然会在清理后留下一些残留物。

从 MSDN 中,以下是各种构建步骤的调用顺序:

  1. 预构建事件
  2. 单个文件上的自定义构建步骤
  3. 代理生成器
  4. MIDL
  5. 资源编译器
  6. C/C++ 编译器
  7. 预链接事件
  8. 链接器或库管理员(根据情况)
  9. BSCMake
  10. 项目上的自定义构建步骤
  11. 部署工具。
  12. 后构建事件

    MSDN: 了解自定义构建步骤


给我一个想法:在 Pre-Build 中编写清理脚本,仅在成功构建时设置 Post-Build 运行,并故意在您的代码中编写基本语法错误。构建(Pre-Build 执行自定义操作)。清理项目(正常清理)。 - Kache

0
其他方法并没有完全符合我的要求,我找到了更好的方法。在VS2010中测试C++ Win32项目时,进入项目属性-->配置属性-->自定义构建设置。您可以添加自定义命令行,并告诉VS在执行命令之前或之后执行哪个操作。

2
似乎该功能在“Clean”事件中无法正常工作。还有其他的清理事件,如CppClean、CoreClean等。我没有时间尝试它们所有。也许我犯了一个错误。 - Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接