8

这周我对 msbuild 很感兴趣。我正在清理许多极其复杂的构建脚本。深入挖掘它的功能让我感到惊讶 - msbuild 本身就是 .NET 编程的一个隐藏特性。

在问题必须有答案的 SO 约定中,在几天或一周内,我会将最有用或最酷的隐藏功能标记为已接受。

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

有用的定义:我正在更新现有的 msbuild 脚本:打包(zip 文件)网站和实用程序、CC.NET 集成、启动测试(UT + selenium)、构建数据库。我正在添加(新目标,甚至更有用):部署到 VMWare 虚拟服务器,链式构建(立即快速构建,排队慢速测试)。如果您引用外部库(如MSBuild 社区任务),最好知道如何获取它。

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

  • 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>
4

5 回答 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'">
于 2009-05-10T22:21:40.610 回答
4

这并不是一个真正的隐藏功能,但我认为批处理在理解后非常强大。

有关更多信息,您可以阅读我的相关博客文章:

赛义德·易卜拉欣·哈希米

我的书:Microsoft Build Engine 内部:使用 MSBuild 和 Team Foundation Build

于 2009-05-18T15:31:33.330 回答
3

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

于 2009-05-18T15:20:32.570 回答
2
  • 我发现MSBuild 扩展包非常有用。文档组织得很好,很容易找到您需要的信息。

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

  • Attrice 有一个令人难以置信的工具,如果我需要处理构建脚本,我会经常使用它。值得您尝试一下的原因在于,它有一个调试器,当它执行构建脚本时,它会向您显示相关任务,并在运行构建脚本时使用 auto 和 watch 变量。Microsoft Build Sidekick v2.3

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

    参数="--force -q"

于 2009-05-18T11:52:23.723 回答
0

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

于 2009-05-11T16:15:10.773 回答