10

在 Visual Studio(2010 及更高版本)中查看文件的属性时,可以在 General 部分设置 Item Type。例如,对于 C++,项目类型是“C/C++ 编译器”。

有一个“自定义构建工具”类型可用,但必须为属于该类别的每个文件完全配置它。

我的问题是:

  1. 有没有办法配置“自定义构建工具”并使其在项目类型列表中可用;
  2. 是否可以将文件扩展名与这个新的项目类型构建器相关联?
4

1 回答 1

15

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

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

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

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

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

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

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

  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。它还知道内容为 type 的文件是 typeMYBUILD的项目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>
    

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

  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"/>
    

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

自定义构建

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

于 2015-08-23T18:39:48.953 回答