本周我对msbuild感兴趣。我正在清理许多非常复杂的构建脚本。挖掘它可以做多少让我感到惊讶 - msbuild本身就是.NET编程的隐藏功能。
在SO约定中,问题必须有答案,在几天或一周内,我会将最有用或最酷的隐藏功能标记为已接受。
let bestAnswer suprise slick useful = (surprise + slick + 2*useful)
有用的定义:我正在更新现有的msbuild脚本:package(zip文件)网站和实用程序,CC.NET集成,启动测试(UT + selenium),构建数据库。我正在添加(新目标,甚至更有用):部署到VMWare虚拟服务器,链式构建(立即快速构建,队列慢速测试)。如果您引用外部库(如MSBuild community tasks),那么知道如何获取它会很好。
我已经找到了一些msbuild惊喜。
这是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>
答案 0 :(得分: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'">
答案 1 :(得分:4)
这不是一个隐藏的功能,但我认为batching在理解时非常强大。
有关详细信息,请阅读我的相关博客条目:
Sayed Ibrahim Hashimi
我的书:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build
答案 2 :(得分:3)
使用 / M 命令行参数启用所有可用CPU核心的使用。
答案 3 :(得分:2)
我发现MSBuild Extension包非常令人难以置信 有用。文档组织得很好,很容易找到所需的信息。
他们在为构建文件配置智能感知时有一节,可以找到here
Attrice有一个令人难以置信的工具,如果我需要处理构建脚本,我经常使用它。让它值得您尝试一下的原因是,它有一个调试器,它会在运行构建脚本时使用auto和监视变量执行构建脚本时向您显示相关任务。 Microsoft Build Sidekick v2.3
将SVN设置为安静,这让我感觉很快就提高了构建过程的速度。将以下内容添加到MSBuild.Community.Tasks.Subversion.SvnExport将运行构建而不记录它从SVN中获取的每个文件
Arguments =“ - force -q”
答案 4 :(得分:0)
您可以从另一个中引用一个msbuild文件。我们的所有目标,例如运行NCover,SourceMonitor,Duplo等的目标都在公共目标文件中。对于每个项目,我们创建一个带有PropertyGroup和ItemGroup部分的msbuild文件,然后是一个包含到公共目标的文件。这保证了我们所有的构建都将运行相同的分析任务集,并节省我们编写脚本的时间。