【问题标题】:Prebuild event in Visual Studio replacing $(SolutionDir) with *Undefined*Visual Studio 中的 Prebuild 事件将 $(SolutionDir) 替换为 *Undefined*
【发布时间】:2021-09-09 09:09:38
【问题描述】:

我相信该问题已记录在案 here moved here 并且看起来可能是 Visual Studio 中的错误,但我想知道是否有人知道解决方法。

基本上,在预构建事件中,我有以下两行(除其他外)一个接一个。

"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "$(SolutionDir)Folder1\Project1.csproj"

"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "$(SolutionDir)Folder2\Folder3\Project2.csproj" 

第一个成功,另一个失败说The command ""C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "*Undefined*Folder2\Folder3\Project2.csproj"" exited with code 1.

编辑:
发现问题在于与预构建具有相同行的其他项目之一失败,因为 MSBuild 本身不知道宏。

【问题讨论】:

  • 作者仅供参考:链接已损坏(VS 反馈)。

标签: visual-studio-2008 prebuild


【解决方案1】:

我通过将所有 $(SolutionDir) 替换为 $(ProjectDir)..\ 来解决此问题。

这是由于 MSBuild 独立运行每个项目,因此不是解决方案。它在 VS2010 中运行良好,但在构建服务器上却不行。

【讨论】:

  • 不敢相信这在 2015 年仍然是个问题
  • 太搞笑了,我figured this out too 比你晚了大约 2 周,但最近忘记了我知道答案并最终来到这里
  • 这是因为这不是问题,您正在构建 csproj,而不是解决方案
  • 这在2017年还是个问题,这个答案纠正了问题。
  • 这还是2021年的问题。
【解决方案2】:

浪费了很多时间来寻找这个问题的完美解决方案。使用Directory.Build.props

在您的sln 位置文件夹中创建一个名为Directory.Build.props 的文件并将此代码放入其中:

<Project>
 <PropertyGroup>
    <SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir>
 </PropertyGroup>
</Project>

此文件将被您的所有 csproj 文件自动拾取,并将定义 (SolutionDir) 属性。

【讨论】:

  • 在 VS 2022 中为我工作
【解决方案3】:

Allan 的答案正好在正确的路径上,但是如果你想移动到ProjectDir 的父目录,或者$(ProjectDir)..\ 输出将是string,你需要执行 msbuild 中的“转到父目录”操作
以下是实现此目的的方法:

<PropertyGroup>
  <TrimmedDir>$([System.IO.Path]::GetDirectoryName($(ProjectDir)))</TrimmedDir>
</PropertyGroup>

此代码会将ProjectDir 的父目录路径设置为TrimmedDir 变量。 [System.IO.Path]::GetDirectoryName() 执行此操作。

【讨论】:

    【解决方案4】:

    Allan 的回答是正确的,但在 VS 2019 16.7.2 中将所有 $(SolutionDir) 替换为 $(ProjectDir)..\ 对我不起作用。

    $(ProjectDir)..\ 评估为实际的ProjectDir,并附加了“..\”,而不是向上一个目录。

    相反,我用$(ProjectDir)\.. 替换了所有$(SolutionDir),这正确地上升了一个目录。

    【讨论】:

      【解决方案5】:

      您没有具体说明这种情况是发生在许多项目还是仅发生在一两个项目中。

      如果仅在一个或两个项目中,临时解决方法可能是将 $(SolutionDir) 替换为 Folder2 所在的显式路径。例如,类似:

      "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "C:\AllSolutions\ExampleSolutions\Folder2\Folder3\Project2.csproj"
      

      但为您的项目提供正确的路径。

      【讨论】:

        【解决方案6】:

        如果您仅使用 MSBuild 和 SolutionDir 对某些项目有效,而对其他项目无效,则可能是 SolutionDir 已在工作项目的 .csproj 文件中的某处定义。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-28
          • 2020-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多