gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:15:56 25 4
gpt4 key购买 nike

我是 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com