msbuild的隐藏功能

Pre*_*ous 8 msbuild hidden-features

本周我对msbuild很感兴趣.我正在清理许多非常复杂的构建脚本.挖掘它可以做多少让我感到惊讶 - msbuild本身就是.NET编程的隐藏功能.

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

   let bestAnswer suprise slick useful = (surprise + slick + 2*useful)
Run Code Online (Sandbox Code Playgroud)

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

我已经发现了一些msbuild的惊喜.

  • Hello world使用Message任务和Properties.
  • 使用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>
Run Code Online (Sandbox Code Playgroud)

Sco*_*ein 5

MSBuild有许多不错的功能.我喜欢

递归文件规范

<Files Include="$(src)\**\*.cs" Exclude="$(src)\**\*test.cs" />
Run Code Online (Sandbox Code Playgroud)

批处理和项目元数据

<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>
Run Code Online (Sandbox Code Playgroud)

目标级依赖性分析

<Target Name="Build"
           Inputs="@(MyItems)"
           Outputs="@(MyItems -> '$(MyItems)\%(filename).dll'">
Run Code Online (Sandbox Code Playgroud)