【问题标题】:Hidden features of msbuild [closed]msbuild的隐藏功能[关闭]
【发布时间】:2010-10-25 04:05:08
【问题描述】:

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

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

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

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

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

  • Hello world 使用 Message 任务和属性。
  • 将 msbuild 用作极其复杂的服务器产品的安装程序。 MSB community tasks 托管 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>

【问题讨论】:

  • 这应该是一个社区维基,因为它更多的是讨论而不是问题?
  • 好的。看起来其余的“隐藏功能......”都是社区 wiki。

标签: msbuild hidden-features


【解决方案1】:

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

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

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

我的书:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

【讨论】:

    【解决方案2】:
    • 我发现MSBuild Extension 包非常棒 有用。文档组织得很好,很容易找到您需要的信息。

    • 他们有一节为构建文件配置智能感知,可以在 here 找到。

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

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

      参数="--force -q"

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案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/etc) 之间共享代码的技巧 - 非常有用。
          猜你喜欢
          • 2010-09-08
          • 2011-02-03
          • 2010-09-08
          • 2011-06-25
          • 2010-12-11
          • 1970-01-01
          • 2012-08-24
          • 2011-11-07
          • 2014-08-13
          相关资源
          最近更新 更多