2010-04-15 134 views
14

我对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的空白值设置。

回答

24

嗯 - 混乱位那儿的情况,我会尽力理清

  1. 不要使用$(PROJECTDIR) - 使用$(MSBuildProjectDir) - 这是在您的csproj的位置源代码树并由MSBuild.exe设置为保留属性。我认为直到Microsoft.Common.Targets被导入之后(这由Microsoft.Csharp.targets完成),$(ProjectDir)才可用。财产评估始终在文件中“就地”进行,而不是在所有进口完成时进行。这也许可以解释为什么你看到在Sidekick的工具属性为有效

  2. 同样使用$(MSBuildProjectName)(我认为这将解决你的问题)

  3. 我不确定VS2010和TFS2010(如它使用MSBuild 4.0,毫无疑问是一个新的TeamBuild),但在2008年,在.csproj中很难确定是从命令行/ IDE构建还是从TeamBuild内部调用构建。我想说的是我不认为$(TeamBuildOutDir)在你的csproj中可用。我通常测试$(TeamBuildConstants)属性,因为该属性当teambuild调用您的proj文件时传递。 YMMV,因为我还没有玩过2010年..

+0

是啊,你是对的 - ProjectDir设置(直接从MSBuildProjectDir,实际上)在Microsoft.Common.Targets。我在调查这件事时发现了很多。我想我自己的困惑源于这样一个事实,即我还不了解common.targets,csharp.targets,问题中的csproj文件的顺序等。 2.我从预生成宏页面中获取了ProjectName项目的属性页面 - 我需要调查MSBuildProjectName是否可用于团队构建。 MSBuildProjectName来自哪里?任何想法如何提供? – bwerks 2010-04-16 15:36:58

+1

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

+3

+1:我只是花了整个下午的时间在'$(ProjectName)'上敲打我的脑袋,还没有设置好。这会教会我不要先检查Stack Overflow ... – 2010-08-09 20:39:18