扩展 Visual Studio (2010+) 项类型处理程序

Extend Visual Studio (2010+) Item Type handlers

在 Visual Studio(2010 及更高版本)中查看文件属性时,可以在常规部分中设置项目类型。例如,对于 C++,项目类型是 "C/C++ compiler".

有一个 "Custom Build Tool" 类型可用,但必须为属于该类别的每个文件完全配置它。

我的问题是:

  1. 有没有办法配置 "Custom Build Tool" 并使其在项目类型列表中可用;
  2. 是否可以将文件扩展名与这个新的项目类型构建器相关联?

我使用以下参考资料找到了答案:

事实证明,完整的设置非常复杂,所以我将限制我的回答,以最简单的步骤回答我的两个初始问题:

在 MSVC 中添加自定义构建工具

  1. 在项目文件 (vcxproj) 中,包含一个新的构建定义(可能有一种方法可以在系统范围内包含它,但我还没有研究过) :

    <ImportGroup Label="ExtensionTargets">
    <Import Project="mybuild.targets" />
    </ImportGroup>
    

这可以在收盘前进行 </Project>

  1. 在与 vcxproj 文件相同的文件夹中创建一个名为 mybuild.targets 的文本文件。

  2. mybuild.targets中插入以下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ItemGroup>
        <PropertyPageSchema 
            Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
      </ItemGroup>
    </Project>
    
  3. 此目标文件指的是包含更多详细信息的 xml 文件($(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml,在此示例中指的是 mybuild.xml)。创建 mybuild.xml.

  4. mybuild.xml中插入以下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
          xmlns:sys="clr-namespace:System;assembly=mscorlib">
      <ItemType Name="MYBUILD" DisplayName="My Custom Build" />
    </ProjectSchemaDefinitions>
    

我们刚刚做了什么:项目文件现在包含一个新的目标定义 (mybuild.targets)。该文件通常包含有关如何执行实际构建的更多信息,但此处它仅包含对 mybuild.xml 文件的包含。此 mybuild.xml 文件包含一个名为内部名称 MYBUILD 和显示名称 My Custom Build 的新项类型定义。当项目在 Visual Studio 中重新打开时,新的项目类型将在项目类型列表中可用。选择它会将此项目的类型设置为 MYBUILD,并且由于此时我们没有为该类型的项目定义规则,因此它会从构建中被忽略。

将文件扩展名与自定义项目类型 MSVC 相关联

分两步完成:

  1. 将文件扩展名与内容类型相关联。这是通过在 mybuild.xml 中添加一个条目来完成的,如下所示:

     <FileExtension Name="*.myext" ContentType="MYBUILD" />
    
  2. 将内容类型与项目类型相关联。这是通过在 mybuild.xml 中添加一个条目来完成的,如下所示:

     <ContentType Name="MYBUILD" DisplayName="My Custom Build" ItemType="MYBUILD" />
    

此时,mybuild.xml 看起来像这样:

    <?xml version="1.0" encoding="utf-8"?>
    <ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
          xmlns:sys="clr-namespace:System;assembly=mscorlib">
      <ItemType Name="MYBUILD" DisplayName="My Custom Build" />
      <FileExtension Name="*.hh" ContentType="MYBUILD" />
      <ContentType Name="MYBUILD" DisplayName="My Custom Build" ItemType="MYBUILD" />
    </ProjectSchemaDefinitions>

我们刚刚做了什么:Visual Studio 现在知道扩展 .myext 包含类型 MYBUILD 的数据。它还知道内容类型为 MYBUILD 的文件是类型为 MYBUILD 的项目。在 Visual Studio 中重新打开项目后,当添加扩展名为 .myext 的文件时,Visual Studio 将自动将这些文件的项目类型设置为“我的自定义构建”。

在自定义项 MSVC 上执行自定义工具

此时,我们有一个与自定义项类型关联的文件扩展名。我们需要将该项目类型与一组构建规则相关联。

  1. 将项目类型与构建目标相关联。在 mybuild.targets 中,在与我们的 PropertyPageSchema 相同的 ItemGroup 中添加以下内容:

     <AvailableItemName Include="MYBUILD">
       <Targets>_MYBUILD</Targets>
     </AvailableItemName>
    

所以它现在看起来像这样:

    <ItemGroup>
      <PropertyPageSchema
            Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
      <AvailableItemName Include="MYBUILD">
        <Targets>_MYBUILD</Targets>
      </AvailableItemName>
    </ItemGroup>
  1. 定义自定义目标。您可以在此处映射应该用于配置构建任务的所有属性和变量。在下一步中,我们将使用一个使用命令行模板的构建任务,因此在我们的目标中,我们将配置实际的命令行。这正好在上一步中定义的 ItemGroup 下方:

     <Target Name="_MYBUILD">
         <MYBUILD CommandLineTemplate="explorer $(IntDir)"></MYBUILD>
     </Target>
    

我们的命令行将简单地打开一个资源管理器 window。

  1. 声明自定义生成任务。这紧跟在上一步的 Target 之后:

     <UsingTask TaskName="MYBUILD" TaskFactory="XamlTaskFactory" AssemblyName="Microsoft.Build.Tasks.v4.0">
         <Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task>
     </UsingTask>
    

在这里,我们引用了将在我们的 mybuild.xml 文件中定义的任务。

  1. mybuild.xml中添加如下规则:

     <Rule Name="MYBUILD" PageTemplate="tool" DisplayName="My Custom Build" Order="200"/>
    

我们刚刚做了什么:我们将自定义项类型映射到自定义目标,以及打开资源管理器的自定义构建任务 window。当我们构建 .myext 文件时,我们现在可以期望 Visual Studio 弹出一个资源管理器 window.

自定义构建

有一些方法可以在 属性 window 中添加配置字段,将它们映射到变量并使用它们来配置任务。这在此处没有涉及,但在顶部提供的链接中进行了讨论。