24

问题

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

现有不合标准的解决方案

在每个文件上,每次添加时,我都可以转到文件设置,将项目类型设置为自定义构建工具,然后在自定义构建工具对话框中,设置命令行参数,设置(硬编码)输出,然后设置(硬编码的)附加依赖项。

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

所需的解决方案

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

我尝试过的事情

基于此: 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 年被弃用,我一直无法弄清楚如何在新系统中复制它。

帮助?

4

1 回答 1

9

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

如下所示:

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

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

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

希望这可以帮助。

演练:使用 MSBuild 创建 Visual C++ 项目

如何:将自定义构建工具添加到 MSBuild 项目

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

于 2012-11-11T21:07:05.047 回答