我对MSBuild比较陌生,我在一个WPF项目文件上进行了一些自定义操作,该项目文件会在Visual Studio 2010和TFS 2010中生成。我已按如下方式自定义了输出路径:
<OutputPath Condition=" '$(TeamBuildOutDir)' == '' ">$(SolutionDir)build\binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath>
<OutputPath Condition=" '$(TeamBuildOutDir)' != '' ">$(TeamBuildOutDir)binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath>
这使得我可以在桌面上构建到一个集中的二进制文件目录,并且在CI构建运行时,TFS可以找到这些二进制文件。
然而,在两种情况下,$(ProjectDir) 属性在构建时评估为空字符串,这会导致奇怪的结果。经过一些调试,看起来 $(ProjectName) 在 BeforeBuild 执行时已设置,但是我的 OutputPath 属性在此之前进行了评估。
<ProjectNameUsedTooEarly Condition=" '$(ProjectName)' == '' ">true</ProjectNameUsedTooEarly>
在同一属性组中,前面的属性与我的OutputPath属性相同。在BeforeBuild目标中,$(ProjectNameUsedTooEarly)会评估为true,但$(ProjectName)到那个时候会像正常一样评估为项目名称。
我应该怎么做才能确保我使用$(ProjectName)时它已经有一个值了呢?
我刚刚使用了Attrice的MSBuild Sidekick来调试我的构建文件,在第一个可用于断点的目标(_CheckForInvalidConfigurationAndPlatform)中,所有属性似乎都已经设置好了。ProjectName已经正确设置,但是我的OutputPath属性已经使用ProjectName的空值进行了设置。
$(ProjectName)
还没被设置,这会教训我要先去查 Stack Overflow... - James McNellis