我对MSBuild相当陌生,并且我已经在一个Wpf项目文件上做了一些自定义工作,我正在VS2010和TFS2010中构建它们。
<OutputPath Condition=" '$(TeamBuildOutDir)' == '' ">$(SolutionDir)build\binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath>
<OutputPath Condition=" '$(TeamBuildOutDir)' != '' ">$(TeamBuildOutDir)binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath>
这样我就可以在桌面上建立的时候建立一个集中的二进制文件目录,并允许TFS找到二进制文件时,CI构建运行:我如下定制的输出路径。
但是,似乎在这两种情况下,$(ProjectDir)属性在构建时计算为“',这会产生奇怪的结果。做一些调试,看起来好像$(ProjectName)是在BeforeBuild执行时设置的,但是我的OutputPath属性在该点之前正在评估它。
<ProjectNameUsedTooEarly Condition=" '$(ProjectName)' == '' ">true</ProjectNameUsedTooEarly>
上述属性与我的OutputPath属性位于相同的属性组中。在BeforeBuild目标中,$(ProjectNameUsedTooEarly)的计算结果为true,但$(ProjectName)按照正常情况评估项目名称。
我能做些什么来确保$(ProjectName)在我使用它时有一个值?我只是使用Attrice的MSBuild Sidekick来调试通过我的构建文件,并在第一个可用于断点(_CheckForInvalidConfigurationAndPlatform)的目标,所有的属性似乎已经设置好了。 ProjectName已正确设置,但我的OutputPath属性已使用ProjectName的空白值设置。
是啊,你是对的 - ProjectDir设置(直接从MSBuildProjectDir,实际上)在Microsoft.Common.Targets。我在调查这件事时发现了很多。我想我自己的困惑源于这样一个事实,即我还不了解common.targets,csharp.targets,问题中的csproj文件的顺序等。 2.我从预生成宏页面中获取了ProjectName项目的属性页面 - 我需要调查MSBuildProjectName是否可用于团队构建。 MSBuildProjectName来自哪里?任何想法如何提供? – bwerks 2010-04-16 15:36:58
3.显然,篡改和无效的IsDesktopBuild已被$(BuildingInsideVisualStudio)取代,但我只假设这已经看到了我的构建日志中的属性。至于TeamBuildOutDir,你是对的 - 它不是在一个普通的VS版本中设置的,所以你的反应只是基于它的存在。我实际上从http://blogs.msdn.com/aaronhallberg/archive/2007/06/07/preserving-output-directory-structures-in-orcas-team-build.aspx得到了这个想法。 – bwerks 2010-04-16 15:37:24
+1:我只是花了整个下午的时间在'$(ProjectName)'上敲打我的脑袋,还没有设置好。这会教会我不要先检查Stack Overflow ... – 2010-08-09 20:39:18