visual-studio-2010 - MSBuild 何时设置 $(ProjectName) 属性?

标签 visual-studio-2010 msbuild tfsbuild

我是 MSBuild 的新手,我已经对我在 Visual Studio 2010 和 TFS 2010 中构建的 WPF 项目文件进行了一些自定义。我已经自定义了输出路径,如下所示:

<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) - 这是您的 csproj 在源代码树中的位置,由 MSBuild.exe 设置为保留属性。我认为 $(ProjectDir) 直到 Microsoft.Common.Targets 被导入(由 Microsoft.Csharp.targets 完成)之后才可用。属性评估总是在文件中“就地”进行,而不是在所有导入完成后进行。这可以解释为什么您在 SideKick 工具中看到该属性是有效的
  • 同样使用 $(MSBuildProjectName) (我认为这将解决您的问题)
  • 我不确定 VS2010 和 TFS2010(因为它使用 MSBuild 4.0,毫无疑问是新的 TeamBuild),但在 2008 年,在 .csproj 中很难确定您的构建是从命令行/IDE 构建还是从在 TeamBuild 中。我想说的是,我认为您的 csproj 中没有 $(TeamBuildOutDir) 可用。我通常测试 $(TeamBuildConstants) 属性,因为当 teambuild 调用您的 proj 文件时该属性会被传递。 YMMV,因为我还没有玩过 2010..
  • 关于visual-studio-2010 - MSBuild 何时设置 $(ProjectName) 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2647373/

    相关文章:

    asp.net - Silverlight xap文件未复制到Build Server上的ClientBin

    tfsbuild - VSTS Release Management 部署因安全问题而失败

    TFS 无法还原 NuGet 包

    visual-studio-2010 - VS 2010 C++ 智能感知

    tfs - VS2015 使用 TFS2013 构建

    c# - 如何在 Java 中使用 .Net 程序集

    unit-testing - 使用 Jenkins 进行 UWP 单元测试

    tfs - 程序集版本是否可以随每个 TFS 2010 版本自动更新?

    c# - 复制控件时如何复制控件关联的事件?

    c++ - Autoexp.dat 版本