Visual Studio是否支持将MSBuild任务添加到项目中?

我试图添加一些简单的MSBuild任务到Visual Studio项目(VS 2012 Express) – 具体来说,创build一个子目录,然后将一些文件复制到输出目录的子目录准备打包。

我看到VS支持自定义构build步骤,这是命令行调用。 但是,由于VS基于MSBuild,因此应该可以将这些直接添加为MSBuild任务,如AfterBuild预定义目标中的“复制任务 ”。

我找不到在Visual Studio框架中实际添加这些任务的方法。 文档只是从MSBuild的angular度来讨论它,而不是在Visual Studio的UI中如何工作 。 它似乎也没有讨论在那里提到构build输出的属性。 大概他们只是由msbuild使用自己 。

是否支持Visual Studio的用户界面中的MSBuild任务pipe理,它只是从我的Express版本中瘫痪? 或者我必须去破解项目文件XML来添加MSBuild任务? 这是支持的,它应该做的方式?

我习惯于使用Eclipse和Ant或Maven,在IDE中支持所有这些,尽pipe您可以直接使用XML。 在Visual Studio中找不到任何用于MSBuild任务pipe理的用户界面非常混乱。 我是否错过了使用免费赠品的明显或跛脚?

Solutions Collecting From Web of "Visual Studio是否支持将MSBuild任务添加到项目中?"

对于C ++项目,您可以使用该属性

<CppCleanDependsOn>DeleteOutputs;$(CppCleanDependsOn)</CppCleanDependsOn> 

而不是像你那样定义BeforeClean目标。

从我读的,CallTarget是要避免的。 在你的例子中,你应该使用DependsOnTargets来做到这一点,就像你在MS提供的文件中的许多虚拟目标中看到的那样。 目标只是“调用”其他目标的功能的类似机制是用DependsOnTargets完成的。 流程与程序编程不完全相同。

智能感知:我从来不使用它。 这只适用于道具文件中的条件AdditionalIncludeDirectories吗? 继续编辑IDE所放置的proj文件中的条目,只要在IDE中只选择一个配置即可编辑该属性。

我正在使用VS2010 Pro,而且它并不公开AfterBuild目标,至少在C ++项目中是我正在做的。 正如你所看到的,它确实有“事件”,根据我所读的是与VSBuild转换的项目向后兼容。 我同意,一个MSBuild的任务,而不是一个命令脚本是要走的路。

忘记用户界面。 它支持XML文件的自由编辑,并继续使用UI,因为它尊重您在那里的内容,并使用标签作为自己的东西,以便它可以找到它来更新它。

但要保持整洁,可以使用属性页面; 一个带有* .props名称的独立XML文件,并把它放在里面。 然后使用UI将该道具文件添加到项目中。 您不会手动编辑UI所维护的项目文件,除非您通过属性管理器视图并明确打开它,否则它将不会触摸props文件。

哦,我还记得看到像包装和发布等额外的标准目标。 也许那些没有用在你的项目类型上,但是你可以使用这些入口点。

(经过一堆更多的阅读,我发现这是如何工作的)

Visual Studio似乎并不公开高级MSBuild项目编辑,即使现代的vcxproj文件只是MSBuild项目文件,带有一些额外的标记属性和Visual Studio IDE特定的其他条目。 所以你必须破解项目的XML。

为了使其更清洁,只需将一行添加到实际的vcxproj文件中 – 包含一个.targets文件,其中包含您的其他构建自定义文件。 例如,在项目文件结束之前,插入:

  <Import Project="pg_sysdatetime.targets" /> </Build> 

现在创建与任何其他MSBuild项目具有相同结构的.targets文件。 这是我一直在做的项目中的我的 :

 <?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中,您需要添加专门命名的目标,以调用所需的目标。 在这里你可以看到我已经定义了BeforeCleanAfterBuild目标。 你可以从VS集成文档中获得支持的目标。

现在,当我建立或重建,一个包含产品DLL和一堆静态文件的新目录被自动创建,准备压缩。 如果我想要,我可以为MSBuild社区扩展添加Nuget包,并使用Zip任务将整个事件捆绑到一个zip文件中。

顺便说一句,虽然你可以在.targets文件中定义属性,但最好在属性表中定义它们。 这样他们就可以在UI中看到。