扩展 Visual Studio (2010+) 项类型处理程序
Extend Visual Studio (2010+) Item Type handlers
在 Visual Studio(2010 及更高版本)中查看文件属性时,可以在常规部分中设置项目类型。例如,对于 C++,项目类型是 "C/C++ compiler".
有一个 "Custom Build Tool" 类型可用,但必须为属于该类别的每个文件完全配置它。
我的问题是:
- 有没有办法配置 "Custom Build Tool" 并使其在项目类型列表中可用;
- 是否可以将文件扩展名与这个新的项目类型构建器相关联?
我使用以下参考资料找到了答案:
Integrating a compiler/assembler in VS ; Using NASM with Visual Studio 2010
by perilbrain 在 CodeProject 上:http://www.codeproject.com/Articles/410776/Integrating-a-compiler-assembler-in-VS-Using-NASM
Platform Extensibility - Part 1
,作者:Pavan Adharapurapu 在 MSDN 博客上:https://docs.microsoft.com/en-us/archive/blogs/vsproject/platform-extensibility-part-1
Platform Extensibility - Part 2
,作者:Pavan Adharapurapu 在 MSDN 博客上:https://docs.microsoft.com/en-us/archive/blogs/vsproject/platform-extensibility-part-2
MSBuild API Reference
在 MSDN 上:https://msdn.microsoft.com/en-us/library/dn715758(v=vs.121).aspx`
事实证明,完整的设置非常复杂,所以我将限制我的回答,以最简单的步骤回答我的两个初始问题:
在 MSVC 中添加自定义构建工具
在项目文件 (vcxproj
) 中,包含一个新的构建定义(可能有一种方法可以在系统范围内包含它,但我还没有研究过) :
<ImportGroup Label="ExtensionTargets">
<Import Project="mybuild.targets" />
</ImportGroup>
这可以在收盘前进行 </Project>
。
在与 vcxproj
文件相同的文件夹中创建一个名为 mybuild.targets
的文本文件。
在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>
此目标文件指的是包含更多详细信息的 xml 文件($(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml
,在此示例中指的是 mybuild.xml)。创建 mybuild.xml
.
在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 相关联
分两步完成:
将文件扩展名与内容类型相关联。这是通过在 mybuild.xml
中添加一个条目来完成的,如下所示:
<FileExtension Name="*.myext" ContentType="MYBUILD" />
将内容类型与项目类型相关联。这是通过在 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 上执行自定义工具
此时,我们有一个与自定义项类型关联的文件扩展名。我们需要将该项目类型与一组构建规则相关联。
将项目类型与构建目标相关联。在 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>
定义自定义目标。您可以在此处映射应该用于配置构建任务的所有属性和变量。在下一步中,我们将使用一个使用命令行模板的构建任务,因此在我们的目标中,我们将配置实际的命令行。这正好在上一步中定义的 ItemGroup
下方:
<Target Name="_MYBUILD">
<MYBUILD CommandLineTemplate="explorer $(IntDir)"></MYBUILD>
</Target>
我们的命令行将简单地打开一个资源管理器 window。
声明自定义生成任务。这紧跟在上一步的 Target
之后:
<UsingTask TaskName="MYBUILD" TaskFactory="XamlTaskFactory" AssemblyName="Microsoft.Build.Tasks.v4.0">
<Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task>
</UsingTask>
在这里,我们引用了将在我们的 mybuild.xml
文件中定义的任务。
在mybuild.xml
中添加如下规则:
<Rule Name="MYBUILD" PageTemplate="tool" DisplayName="My Custom Build" Order="200"/>
我们刚刚做了什么:我们将自定义项类型映射到自定义目标,以及打开资源管理器的自定义构建任务 window。当我们构建 .myext
文件时,我们现在可以期望 Visual Studio 弹出一个资源管理器 window.
自定义构建
有一些方法可以在 属性 window 中添加配置字段,将它们映射到变量并使用它们来配置任务。这在此处没有涉及,但在顶部提供的链接中进行了讨论。
在 Visual Studio(2010 及更高版本)中查看文件属性时,可以在常规部分中设置项目类型。例如,对于 C++,项目类型是 "C/C++ compiler".
有一个 "Custom Build Tool" 类型可用,但必须为属于该类别的每个文件完全配置它。
我的问题是:
- 有没有办法配置 "Custom Build Tool" 并使其在项目类型列表中可用;
- 是否可以将文件扩展名与这个新的项目类型构建器相关联?
我使用以下参考资料找到了答案:
Integrating a compiler/assembler in VS ; Using NASM with Visual Studio 2010
by perilbrain 在 CodeProject 上:http://www.codeproject.com/Articles/410776/Integrating-a-compiler-assembler-in-VS-Using-NASMPlatform Extensibility - Part 1
,作者:Pavan Adharapurapu 在 MSDN 博客上:https://docs.microsoft.com/en-us/archive/blogs/vsproject/platform-extensibility-part-1Platform Extensibility - Part 2
,作者:Pavan Adharapurapu 在 MSDN 博客上:https://docs.microsoft.com/en-us/archive/blogs/vsproject/platform-extensibility-part-2MSBuild API Reference
在 MSDN 上:https://msdn.microsoft.com/en-us/library/dn715758(v=vs.121).aspx`
事实证明,完整的设置非常复杂,所以我将限制我的回答,以最简单的步骤回答我的两个初始问题:
在 MSVC 中添加自定义构建工具
在项目文件 (
vcxproj
) 中,包含一个新的构建定义(可能有一种方法可以在系统范围内包含它,但我还没有研究过) :<ImportGroup Label="ExtensionTargets"> <Import Project="mybuild.targets" /> </ImportGroup>
这可以在收盘前进行 </Project>
。
在与
vcxproj
文件相同的文件夹中创建一个名为mybuild.targets
的文本文件。在
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>
此目标文件指的是包含更多详细信息的 xml 文件(
$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml
,在此示例中指的是 mybuild.xml)。创建mybuild.xml
.在
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 相关联
分两步完成:
将文件扩展名与内容类型相关联。这是通过在
mybuild.xml
中添加一个条目来完成的,如下所示:<FileExtension Name="*.myext" ContentType="MYBUILD" />
将内容类型与项目类型相关联。这是通过在
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 上执行自定义工具
此时,我们有一个与自定义项类型关联的文件扩展名。我们需要将该项目类型与一组构建规则相关联。
将项目类型与构建目标相关联。在
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>
定义自定义目标。您可以在此处映射应该用于配置构建任务的所有属性和变量。在下一步中,我们将使用一个使用命令行模板的构建任务,因此在我们的目标中,我们将配置实际的命令行。这正好在上一步中定义的
ItemGroup
下方:<Target Name="_MYBUILD"> <MYBUILD CommandLineTemplate="explorer $(IntDir)"></MYBUILD> </Target>
我们的命令行将简单地打开一个资源管理器 window。
声明自定义生成任务。这紧跟在上一步的
Target
之后:<UsingTask TaskName="MYBUILD" TaskFactory="XamlTaskFactory" AssemblyName="Microsoft.Build.Tasks.v4.0"> <Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task> </UsingTask>
在这里,我们引用了将在我们的 mybuild.xml
文件中定义的任务。
在
mybuild.xml
中添加如下规则:<Rule Name="MYBUILD" PageTemplate="tool" DisplayName="My Custom Build" Order="200"/>
我们刚刚做了什么:我们将自定义项类型映射到自定义目标,以及打开资源管理器的自定义构建任务 window。当我们构建 .myext
文件时,我们现在可以期望 Visual Studio 弹出一个资源管理器 window.
自定义构建
有一些方法可以在 属性 window 中添加配置字段,将它们映射到变量并使用它们来配置任务。这在此处没有涉及,但在顶部提供的链接中进行了讨论。