我正在进入MSBuild来处理项目的各种目标,我发现它非常灵活.(它也帮助我了解CI系统的可能性)
我需要获得项目的当前SVN修订版本,为此我编写了一个调用SubWCRev并解析输出的自定义任务.
我使用元素引用它:
<UsingTask TaskName="xxx.Elements.Build.MSBuildTasks.SubWCRev" AssemblyFile="D:\dev\xxx_presentation\Build\xxx.Elements.Build.dll">
<ParameterGroup>
<LastCommittedRevision ParameterType="System.Int" Required="False" Output="True" />
<MixedRevisionRangeMinimum ParameterType="System.Int" Required="False" Output="True" />
<MixedRevisionRangeMaximum ParameterType="System.Int" Required="False" Output="True" />
<HasLocalModifications ParameterType="System.Boolean" Required="False" Output="True" />
</ParameterGroup>
</UsingTask>
Run Code Online (Sandbox Code Playgroud)
然后我执行任务......
<Target Name="Version" BeforeTargets="BuildDatabase">
<xxx.Elements.Build.MSBuildTasks.SubWCRev WorkingCopyDir="$(ProjectDir)..">
<Output TaskParameter="LastCommittedRevision" ItemName="LastCommittedRevision" />
<Output TaskParameter="MixedRevisionRangeMinimum" ItemName="MixedRevisionRangeMinimum" />
<Output TaskParameter="MixedRevisionRangeMaximum" ItemName="MixedRevisionRangeMaximum" />
<Output TaskParameter="HasLocalModifications" ItemName="HasLocalModifications" />
</xxx.Elements.Build.MSBuildTasks.SubWCRev>
<Message Text="Revision is @(LastCommittedRevision)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
我的问题是MSBuild坚持使用TaskFactory属性,本文档说这是可选的.而且我也看到TaskFactory特别适用于内联任务,我对此并不感兴趣.
错误消息是:
必需属性"TaskFactory"在元素UsingTask中为空或缺少.
我哪里错了?
(顺便说一句,我发现MSBuild Sidekick 3非常出色并且减少了可能成为一个相当复杂的脚本的阻力.)
我有一个MSBuild构建文件,可以在我的本地开发框上正确运行但在我们的CI构建框上失败.
失败的构建目标如下:
<Target Name="Clean">
<MSBuild Projects="Solution.sln" Targets="Clean" BuildInParallel="True"/>
</Target>
Run Code Online (Sandbox Code Playgroud)
并且构建框上的错误是这样的:
"E:\TRUNK\build\Bamboo.build" (Build target) (1) ->
25-Oct-2011 10:22:51 (Clean target) ->
25-Oct-2011 10:22:51 E:\TRUNK\build\build.build(19,55): error MSB4064: The "BuildInParallel" parameter is not supported by the "MSBuild" task. Verify the parameter exists on the task, and it is a settable public instance property.
25-Oct-2011 10:22:51 E:\TRUNK\build\build.build(19,5): error MSB4063: The "MSBuild" task could not be initialized with its input parameters.
Run Code Online (Sandbox Code Playgroud)
两台机器报告都有MSBuild版本4.0.30319.1
Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.237]
Copyright (C) …Run Code Online (Sandbox Code Playgroud) 我看到ItemGroup标签有一些奇怪的行为.
我的应用程序依赖于几个DLL,我将这些DLL以及可执行文件复制到部署目录,NSIS使用该目录从新构建创建安装包.但是,我遇到了一个奇怪的问题.
我定义我的ItemGroup如下(在我定义构建目标之前在文件的顶部:
<MyAppFiles Include="$(ProjectRoot)\$(OutputPath)\*.dll;$(ProjectRoot)\$(OutputPath)\MyApp.exe" />
Run Code Online (Sandbox Code Playgroud)
因此,这会抓取目录中的所有DLL以及二进制文件MyApp.exe.但是,如果项目已被清理(即,没有文件$(OutputPath)).DLL不包含在ItemGroup文件列表中.现在,如果我用另一个构建来跟进它(即,有来自前一个构建的文件$(OutputPath)),则ItemGroup包含我想要的所有文件.
此外,我已检查构建脚本的输出,并将DLL复制到$(OutputPath)是否发生了清理.
所以,我的问题是,如何更正我的构建脚本,以便ItemGroup始终包含DLL?ItemGroup在构建发生之前,似乎填充了文件,因此如果在构建之前文件不存在,它们不会包含在列表中,但如果它们在构建之前存在,那么它们就是.
作为参考,这是我正在使用的构建目标:
<PropertyGroup>
<MyAppRoot>..\MyApp</MyAppRoot>
<MyAppProject>$(MyAppRoot)\MyApp.csproj</MyAppProject>
<PropertyGroup>
<Target Name="BuildProject">
<Message Text="BEFORE: @(ProjectFiles)" />
<MSBuild Projects="$(MyAppProject)" Targets="Build" Properties="Configuration=$(Configuration)">
<Output TaskParameter="TargetOutputs" ItemName="MyAppAssembly"/>
</MSBuild>
<Message Text="AFTER: @(ProjectFiles)" />
</Target>
Run Code Online (Sandbox Code Playgroud) 我有一个属性来指定构建驱动器:
<PropertyGroup>
<BuildDrive Condition="'$(BuildDrive)'==''">Y:</Group>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
如果要使用批处理文件更改构建驱动器,可以执行以下操作:
@echo off
set buildDrive=H:
:: Then call MSBuild
Msbuild /t:BuildTarget %Projectfile% %Logger%
Run Code Online (Sandbox Code Playgroud)
现在,我想使用PowerShell实现相同的目的。
我在PowerShell脚本build.ps1中尝试了以下操作:
$BuildDrive=H:
MSbuild /t:BuildTarget $ProjectFile $Logger
Run Code Online (Sandbox Code Playgroud)
但是,它不遵守$ BuildDrive提供的驱动器号。我知道,如果我按如下方式传递参数,就可以实现,但是当属性数量更多时,这种方法就不方便了。
$BuildDrive=H:
Msbuild /t:BuildTarget /p:BuildDrive=$BuildDrive $projectfile $logger
Run Code Online (Sandbox Code Playgroud)
如何PropertyGroup通过PowerShell 传递值?
我有一个相当大的解决方案,其中包含两个基于Sandcastle + Sandcastle帮助文件生成器(SHFB)的文档项目.这些项目都可以从命令行(msbuild project.shfb)正确构建,也可以使用SHFB Visual Studio 2010集成的beta版本.
当我在TeamCity中运行构建时,我在文档构建中遇到了一个神秘的构建失败.SHFB日志说明了这一点:
[Sandcastle Help File Builder, version 1.9.3.0]
Cached Resolve Reference Links 2 Component. Copyright © 2006-2011, Eric Woodruff, All Rights Reserved
http://SHFB.CodePlex.com
Info: CachedResolveReferenceLinksComponent: Loaded 61 cached MSDN URL entries
Info: SaveComponent: Instantiating component.
Info: BuildAssembler: Building topic N:MyProject
Info: BuildAssembler: Building topic T:MyProject.ActionNotImplementedException
Info: BuildAssembler: Building topic AllMembers.T:MyProject.ActionNotImplementedException
Info: BuildAssembler: Building topic Methods.T:MyProject.ActionNotImplementedException
Info: BuildAssembler: Building topic Properties.T:MyProject.ActionNotImplementedException
Info: BuildAssembler: Building topic Overload:MyProject.ActionNotImplementedException.#ctor
Info: BuildAssembler: Building topic M:MyProject.ActionNotImplementedException.#ctor
Info: BuildAssembler: … 我想使用bat文件构建安装项目,并希望生成msi。我尝试使用MSBuild.exe进行构建,如下所示
@echo off
call %windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe C:\Setup1\Setup1.sln
Run Code Online (Sandbox Code Playgroud)
但是,似乎MSBUILD不支持安装项目。还有其他想法使用bat文件构建安装项目吗?
我必须承认,对于MSBuild和批处理文件,我有点像菜鸟,所以请耐心等待;)
我有一个文件夹结构,看起来像这样
/src
/SLProject
SLExampleProject.csproj
/WPFProject
WPFExampleProject.csproj
ExampleSolution.sln
Deploy.bat
Run Code Online (Sandbox Code Playgroud)
该解决方案包含多个Silverlight WPF项目,这些项目由/ SLProject和/ WPFProject级别的文件夹分隔.我正在尝试创建批处理文件Deploy.bat以在Silverlight和WPF项目的子集上执行MSBuild,将输出和xcopy DLL混淆到另一个文件夹.
我在与MSBuild相关的批处理文件中遇到问题.当我为要构建的第一个WPF项目指定平台和配置时,我收到错误"没有为项目设置OutputPath属性"...

以下是导致失败的批处理文件的行
call %windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
/t:rebuild /p:Configuration=Release /p:Platform="Any CPU"
Abt.Controls.SciChart.Wpf/Abt.Controls.SciChart.Wpf.csproj
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么想法?我可以证实存在的输出路径为这个项目设置和平台=释放和配置的组合=存在在建项目和它的依赖AnyCPU.
好奇地删除平台="任何CPU",构建成功...
我对TFS很新,所以当我想将目标目录设置为我的构建时,我遇到了这个问题.
每次我启动构建时,它都会大大失败并说"找不到\ xxxxxxx\yyyyy\zzzz".
我认为我的UNC路径是错误的.
假设我的放置目录(目标目录)是"C:\ Project \",我的计算机名称是"lemoos-PC",在UNC表示法中我的路径相当于什么?
我试过这些:
\\lemoos-PC\C\Project\
\\lemoos-PC\C:\Project\
\\lemoos-PC\Project\
但他们似乎没有工作.
提前致谢 .
假设我启动一个构建脚本,定义名为SampleScript,指定参数/p:MyPrefix=Custom.脚本中有以下代码:
<PropertyGroup Condition="$(BuildDefinitionName)=='SampleScript'">
<MyPrefix>Default</MyPrefix>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
我得到的,首先将MyPrefix设置为"Custom",然后将其重载为"Default"(我是对的吗?).如果是这样,有没有办法让用户指定的参数更优先,所以它没有超载?
我需要从chageset获取已更改文件的列表,并排除所有其他垃圾.
我可以从命令tf changeset/i $(changesetnumber)获取此信息,但除了文件列表之外,我还有很多其他信息,我不需要这些信息用于我的目的.
或者也许有人可以告诉如何从ccnet获取此文件列表,以便我可以通过属性将其发送到我的msbuild.proj文件.
msbuild ×10
batch-file ×2
.net ×1
build-script ×1
msbuild-4.0 ×1
msbuild-task ×1
overloading ×1
path ×1
powershell ×1
sandcastle ×1
shfb ×1
team-build ×1
teamcity ×1
tfs ×1
tfs2010 ×1
unc ×1
wpf ×1