在 Visual Studio(2010 及更高版本)中查看文件的属性时,可以在 General 部分设置 Item Type。例如,对于 C++,项目类型是“C/C++ 编译器”。
有一个“自定义构建工具”类型可用,但必须为属于该类别的每个文件完全配置它。
我的问题是:
- 有没有办法配置“自定义构建工具”并使其在项目类型列表中可用;
- 是否可以将文件扩展名与这个新的项目类型构建器相关联?
在 Visual Studio(2010 及更高版本)中查看文件的属性时,可以在 General 部分设置 Item Type。例如,对于 C++,项目类型是“C/C++ 编译器”。
有一个“自定义构建工具”类型可用,但必须为属于该类别的每个文件完全配置它。
我的问题是:
我使用以下参考资料找到了答案:
Integrating a compiler/assembler in VS ; Using NASM with Visual Studio 2010
通过 CodeProject 上的 perilbrain:http: //www.codeproject.com/Articles/410776/Integrating-a-compiler-assembler-in-VS-Using-NASMPlatform Extensibility - Part 1
由 MSDN 博客上的 Pavan Adharapurapu 撰写:https ://docs.microsoft.com/en-us/archive/blogs/vsproject/platform-extensibility-part-1Platform Extensibility - Part 2
由 MSDN 博客上的 Pavan Adharapurapu 撰写: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`事实证明,完整的设置非常复杂,所以我将把我的答案限制在用最简单的步骤回答我的两个初始问题:
在项目文件 ( vcxproj
) 中,包含一个新的构建定义(可能有一种方法可以在系统范围内包含它,但我还没有研究过):
<ImportGroup Label="ExtensionTargets">
<Import Project="mybuild.targets" />
</ImportGroup>
这可以在收盘前进行</Project>
。
mybuild.targets
在与文件相同的文件夹中创建一个名为的文本vcxproj
文件。
在 中插入以下内容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
并且由于此时我们没有为该类型的项目定义规则,因此它将被简单地从构建中忽略。
这分两步完成:
将文件扩展名与内容类型相关联。这是通过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
。它还知道内容为 type 的文件是 typeMYBUILD
的项目MYBUILD
。在 Visual Studio 中重新打开项目后,添加扩展名为 的文件时.myext
,Visual Studio 会自动将这些文件的项目类型设置为“我的自定义构建”。
此时,我们有一个与自定义项目类型相关联的文件扩展名。我们需要将该项目类型与一组构建规则相关联。
将项目类型与构建目标相关联。在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>
我们的命令行将简单地打开一个资源管理器窗口。
声明一个自定义构建任务。这紧跟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"/>
我们刚刚所做的:我们将自定义项目类型映射到自定义目标,以及打开资源管理器窗口的自定义构建任务。当我们构建.myext
文件时,我们现在可以期望 Visual Studio 弹出一个资源管理器窗口。
有一些方法可以在属性窗口中添加配置字段,将它们映射到变量并使用它们来配置任务。此处未对此进行介绍,但在顶部提供的链接中进行了讨论。