【问题标题】:How to create custom clean (post-clean) event in Visual Studio 2008?如何在 Visual Studio 2008 中创建自定义清理(清理后)事件?
【发布时间】:2010-10-12 12:15:51
【问题描述】:

在我们的构建过程中,对于每个项目,我们使用 Post Build 事件将我们的可执行文件复制到单独的部署目录中。这很有效,但问题是我们在执行干净的解决方案/干净的项目后遇到了陈旧文件的问题。我想设置一个“清理”事件来删除复制的文件,而 Visual Studio 2008 似乎没有在项目属性页面中提供选项。

它有:

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

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

【问题讨论】:

    标签: c++ visual-studio visual-studio-2008 visual-c++


    【解决方案1】:

    您可以在您的 csproj 文件中使用 MSBuild 目标语法。 例如

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

    MSBuild 团队博客中描述了一种直接在 Visual Studio IDE 中编辑 .csproj 文件的简洁方法,但这是我的第一篇文章,所以我只能包含一个超链接。 (简单地说:卸载项目,然后右键单击它以查看条目“Edit [project].csproj”...您的 csproj 将在 IDE 中以 xml 文件的形式出现,其中包含元素和属性的智能感知。太棒了!)

    自定义目标的完整列表是here

    【讨论】:

    • 旁注:也可以在记事本[++]中编辑.csproj文件,然后保存时,Visual Studio会检测到它重新加载项目。对于多次不断的试验和错误,这要快一些。虽然没有智能感知。
    • 这个问题被标记为 [c++] 和 [visual-c++] 这意味着他将拥有一个.vcproj 文件而不是.csproj 文件。文件格式似乎不同
    • 以上链接似乎已损坏并且没有waybackmachine 条目。不知道原始链接实际上有什么,但是这两个 MSDoc 参考似乎列出了所有构建过程目标:docs.microsoft.com/en-us/visualstudio/msbuild/…docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-targets
    【解决方案2】:

    对于 Visual C++ 项目,您需要将文件添加到“General”项目配置属性下的“Extensions to Delete On Clean”部分。尽管它声称需要扩展,但它实际上是在使用 glob,并且很乐意接受完整路径并扩展 MSBuild 变量。这对我有用:

    $(ProjectDir)\deployment\*.*

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

    【讨论】:

    • 这对我不起作用。我无法使用 VS 2012 指定完整路径或相对路径
    • 当我发现它是相对于中间目录时它在 Visual 2013 Express 中工作,所以必须使用 $(OutDir) 来删除输出目录中的文件。
    【解决方案3】:

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

    来自:

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

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

    【讨论】:

      【解决方案4】:

      您需要手动编辑 .csproj 文件并添加“AfterClean”目标。

      【讨论】:

      • Scott - 您能否详细说明如何添加“AfterClean”目标?
      • 您的意思是 .vsproj - 不是 .csproj?
      【解决方案5】:

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

      来自 MSDN,这里是各个构建步骤的调用顺序:

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

        MSDN:Understanding custom build steps

      【讨论】:

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

      其他人并没有完全按照我的意愿去做,我只是找到了更好的方法。在 VS2010 中针对 C++ Win32 项目进行了测试,转到项目属性 --> 配置属性 --> 自定义构建设置。你可以添加一个自定义的命令行,告诉VS在执行命令之前或之后执行什么操作。

      【讨论】:

      • 该功能似乎不适用于 Clean 事件。还有其他清理事件,如 CppClean、CoreClean 等。我没有时间尝试所有这些。也许我犯了一个错误。
      猜你喜欢
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 2011-02-05
      • 2012-05-24
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 2017-11-28
      相关资源
      最近更新 更多