MSBuild的隐藏功能

8

这周我对msbuild很感兴趣。我正在整理许多极其复杂的构建脚本。挖掘其中的内容让我惊讶,因为msbuild本身就是.NET编程的一种隐藏特性。

按照SO的规定,问题必须有答案,在几天或一周内,我将选择最有用或最酷的隐藏功能作为被接受的答案。

   let bestAnswer suprise slick useful = (surprise + slick + 2*useful)

“有用”的定义:我正在更新现有的msbuild脚本,以打包(zip文件)网站和实用程序、CC.NET集成、启动测试(UT + selenium)、构建数据库。我正在添加新目标,使其更加有用:部署到VMWare虚拟服务器、链接构建(立即进行快速构建,排队慢速测试)。如果您引用了外部库(如MSBuild社区任务),那么了解如何获取它将是很好的。

我已经发现的一些msbuild惊喜。

  • 使用Message任务和属性的Hello World。
  • 将msbuild用作极其复杂的服务器产品的安装程序。MSB社区任务管理IIS服务器设置。 WriteLinesToFileXmlUpdate任务编写了特定于服务器的配置文件。如果您使用过MSI,则会知道任何东西都比MSI更适合安装。
  • 对于新手:CSProj和Vbproj文件与msbuild“proj”文件相同。要直接编辑:取消加载csproj或vbproj,然后右键单击项目并选择编辑。这比使用笨重的预构建/后构建事件更好、更强大。
  • MSBuild随着通用.NET安装而提供。与其他花哨的工具不同,您可以在完全干净的服务器/桌面上使用它。

这是msbuild的Hello World。写完之后,我发现了MSDN hello world

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build;Test" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
       <Who>World</Who>
  </PropertyGroup>
  <Target Name="Hello">
    <Message Text="Hello, $(Who)" Importance="high" ></Message>
  </Target>
  <Target Name="Build" DependsOnTargets="Hello"/>
  <Target Name="Test"/>
</Project>
5个回答

5

MSBuild有很多不错的功能。我喜欢

递归文件规范

<Files Include="$(src)\**\*.cs" Exclude="$(src)\**\*test.cs" />

批处理和项目元数据

<ItemGroup>
 <F Include="SampleApplication.t">
    <Version>1</Version>
</F>
 <F Include="SampleApplication2.t">
    <Version>1</Version>
</F>
<F Include="SampleApplication3.t">
   <Version>2</Version>
</F>
</ItemGroup>
<Target Name="Build">
<Touch Files="%(F.FullPath)" AlwaysCreate="True" 
        Condition=" '%(F.Version)' > '1' ">
<Output TaskParameter="TouchedFiles" ItemName="CreatedFiles"/>
</Touch>
<Message Text="Created files = @(CreatedFiles)"/>
<Message Text="%(F.Identity) %(F.Version)"/>
</Target>

目标级别依赖分析
<Target Name="Build"
           Inputs="@(MyItems)"
           Outputs="@(MyItems -> '$(MyItems)\%(filename).dll'">

递归 ** 是我用于在框架(CF/Silverlight/.NET等)之间共享代码的技巧 - 非常有用。 - Marc Gravell

4

3

使用/M命令行参数以启用所有可用的CPU核心。


2
  • 我发现MSBuild扩展非常有用。文档组织得很好,易于查找所需信息。

  • 他们有一个关于为构建文件配置智能感知的部分,可以在这里找到。

  • Attrice有一个令人难以置信的工具,如果我需要处理构建脚本,我经常使用它。它值得一试的原因是,它有一个调试器,当执行您的构建脚本时,会显示依赖任务,并带有自动变量和监视变量,同时运行构建脚本。Microsoft Build Sidekick v2.3

  • 将SVN设置为安静模式,这让我觉得大大加快了构建过程的速度。将以下内容添加到MSBuild.Community.Tasks.Subversion.SvnExport中,将在不记录从SVN获取的每个文件的情况下运行构建。

    Arguments="--force -q"


0

你可以在一个msbuild文件中引用另一个。我们所有的目标,例如运行NCover、SourceMonitor、Duplo等的目标都在一个共同的目标文件中。对于每个项目,我们创建一个带有PropertyGroup和ItemGroup部分的msbuild文件,然后包含到共同的目标中。这保证了我们所有的构建将运行相同的分析任务,并节省了编写脚本的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接