【问题标题】:Step by step, how do I add a custom build step for every file of a given type in Visual Studio 2010?一步一步,如何在 Visual Studio 2010 中为给定类型的每个文件添加自定义构建步骤?
【发布时间】:2012-10-22 07:23:59
【问题描述】:

问题

  1. 我在一个 Visual Studio 2010 项目中有一堆自定义文件。
  2. 当这些自定义文件发生变化时,我需要对它们运行一个工具。
  3. 该工具会生成包含在现有 .cpp 文件中的 .h 文件。
  4. 我希望该工具作为构建过程的一部分运行。
  5. 它需要在 Visual Studio 中运行,但理想情况下也可以作为 msbuild 进程的一部分运行。

现有不合标准的解决方案

在每个文件上,每次添加时,我都可以进入文件设置,将Item Type设置为Custom Build Tool,然后在Custom Build Tool对话框中,设置命令行参数,设置(硬编码)输出,并设置(硬编码)附加依赖项。

显然,这是一个糟糕的解决方案,因为每次添加自定义类型的新文件时,它的工作量都很大且容易出错。

想要的解决方案

我设置了 Visual Studio,对于任何扩展名为 .foo 的文件,它都会在 .foo 文件更改时运行工具 bar.exe,然后再编译 CPP 代码。

我尝试过的事情

基于此:http://msdn.microsoft.com/en-us/library/3e889s84(v=vs.100).aspx 我试图建立一个 .targets 和 .xml 文件。但是,我不知道如何创建一个新的项目类型以便它显示在 Visual Studio 中,我也不知道如何让它神奇地应用于每个 .foo 类型的文件。最重要的是,我还没有弄清楚其中的任何链接如何链接到任何描述调用我的 bar.exe 工具的行为。

我尝试搜索所有 Visual Studio 的 xml/targets 文件,以跟踪现有的项目类型并确定它们如何转换为实际的构建操作。它总是在 ItemType 的墙上结束,那里有一堆在 ProjectItemsSchema 中描述的,但我找不到它们在哪里实现,或者我自己如何实现它们。

MSDN 的文档完全失败,我想我已经阅读了每一个可能相关的页面十次,但无济于事。

在 Visual Studio 2008 中,我使用类似这样的 .rules 文件进行了此类操作:

<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="Foo Build Rules"
Version="8.00"
>
<Rules>
    <CustomBuildRule
        Name="FooBuild"
        DisplayName="FooGen"
        CommandLine="..\..\tools\FooGen.exe [inputs]"
        Outputs="$(InputName).h"
        AdditionalDependencies="*.foo"
        FileExtensions="*.foo"
        ExecutionDescription="Generating Foos..."
        >
        <Properties>
        </Properties>
    </CustomBuildRule>
</Rules>
</VisualStudioToolFile>

然而,这个功能在 2010 年已被弃用,我一直无法弄清楚如何在新系统中复制它。

帮助?

【问题讨论】:

标签: visual-studio-2010 msbuild code-generation build-process customtool


【解决方案1】:

首先将自定义 ItemGroup 添加到您的项目文件中。

如下:

<ItemGroup>
    <CustomBuild Include="faq.txt">
      <Message>Copying readme...</Message>
      <Command>copy %(Identity) $(OutDir)%(Identity)</Command>
      <Outputs>$(OutDir)%(Identity)</Outputs>
    </CustomBuild>
  </ItemGroup>

接下来创建一个自定义目标并定义您希望在构建过程中运行自定义目标的位置。

下面的链接会更详细地一步一步地解释。

希望这会有所帮助。

Walk-through: Using MSBuild to Create a Visual C++ Project

How to: Add Custom Build Tools to MSBuild Projects

Note:在当前版本中,IDE不支持创建新规则。因此,使用 Visual C++ 早期版本创建的项目中的规则文件的最简单方法是将项目迁移到当前版本。

【讨论】:

  • 在此示例中,CustomBuild 步骤仅适用于一个文件,faq.txt。 OP 想要一个在多个文件上运行的 CustomBuild 步骤,例如 *.foo
  • 只是跟进,CustomBuild 也可以与通配符一起使用,因此使用 &lt;CustomBuild Include="$(MSBuildProjectDirectory)\**\*.foo"&gt; 可以按预期工作。谢谢。
  • 不推荐使用通配符 - docs.microsoft.com/en-us/cpp/build/reference/… If a .vcxproj project file that includes these constructs gets loaded in the IDE, the project may seem to work at first. However, issues are likely as soon as the project is modified by Visual Studio and then saved on disk. You may experience random crashes and undefined behavior.
  • @MarkIngram 很高兴知道。这是否也与特定版本的 VS 相关?由于 MSBUILD 用于构建一切可能与 VS 无关。我确信也有太多使用通配符的方法。这就像在路​​径中使用 // 或 \\ 而不是像 / 或 \ 这样的一个
  • @MarkIngram 实际上只要通配符在项目组内或目标内,它就不会影响 ide。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多