(经过大量阅读后,我发现了这是如何工作的):
Visual Studio 似乎没有公开高级 MSBuild 项目编辑,即使现代vcxproj
文件只是 MSBuild 项目文件,具有一堆额外的标记属性和 Visual Studio IDE 细节的其他条目。所以你必须破解项目 XML。
vcxproj
为了使其更简洁,只需在您的实际文件中添加一行- 包含一个.targets
包含其余构建自定义的文件。例如,就在项目文件结束之前,插入:
<Import Project="pg_sysdatetime.targets" />
</Build>
现在创建.targets
与任何其他 MSBuild 项目具有相同结构的文件。这是我一直在从事的项目中的内容:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- MSBuild extension targets for Visual Studio build -->
<PropertyGroup>
<DistDir>pg_sysdatetime_pg$(PGMAJORVERSION)-$(Configuration)-$(Platform)</DistDir>
</PropertyGroup>
<ItemGroup>
<DocFiles Include="README.md;LICENSE"/>
<ExtensionSourceFiles Include="pg_sysdatetime--1.0.sql;pg_sysdatetime.control"/>
<ExtensionDll Include="$(TargetDir)\pg_sysdatetime.dll"/>
</ItemGroup>
<Target Name="CopyOutputs">
<Message Text="Copying build product to $(DistDir)" Importance="high" />
<Copy
SourceFiles="@(DocFiles)"
DestinationFolder="$(DistDir)"
/>
<Copy
SourceFiles="@(ExtensionDll)"
DestinationFolder="$(DistDir)\lib"
/>
<Copy
SourceFiles="@(ExtensionSourceFiles)"
DestinationFolder="$(DistDir)\share\extension"
/>
</Target>
<Target Name="DeleteOutputs">
<Message Text="Deleting $(DistDir)" Importance="normal" />
<Delete Files="$(DistDir)"/>
</Target>
<!-- Attach to Visual Studio build hooks -->
<Target Name="BeforeClean">
<CallTarget Targets="DeleteOutputs"/>
</Target>
<Target Name="AfterBuild">
<CallTarget Targets="CopyOutputs"/>
</Target>
</Project>
这可以包含您想要的任何 MSBuild 任务,并分组到目标中。它还可以具有属性组、项组以及 MSBuild 支持的任何其他内容。
要集成到 Visual Studio 中,您需要添加特殊命名的目标来调用您想要的内容。在这里你可以看到我已经定义了BeforeClean
和AfterBuild
目标。您可以从VS 集成文档中获取支持的目标。
现在,当我构建或重建时,会自动创建一个包含产品 DLL 和一堆静态文件的新目录,并准备好压缩。如果我愿意,我可以为 MSBuild 社区扩展添加 Nuget 包,并在最后使用 Zip 任务将整个内容捆绑到一个 zip 文件中。
顺便说一句,虽然您可以在.targets
文件中定义属性,但最好在属性表中定义它们。这样它们就可以在 UI 中看到。