Visual Studio中的预构建事件使用*Undefined*替换$(SolutionDir)

Dav*_*vy8 26 prebuild visual-studio-2008

我相信问题记录在这里 移动到这里,看起来它可能是视觉工作室中的一个错误,但我想知道是否有人知道一个解决方法.

基本上我在预建事件中一个接一个地跟随以下两行(除其他外).

"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" 
Run Code Online (Sandbox Code Playgroud)

第一个成功,另一个失败说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本身不知道宏,因此其他项目之一与预建的线路相同.

All*_*sen 61

我通过更换所有固定这$(SolutionDir)$(ProjectDir)..\.

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

  • 这在2017年仍然是一个问题,这个答案纠正了这个问题. (8认同)
  • 我不敢相信这在2015年仍然是一个问题 (7认同)
  • 我猜我会插话,2022 年仍然是一个问题! (7认同)
  • 你知道吗……到 2023 年这仍然是一个问题。;) (5认同)
  • 这应该是接受的答案权利! (4认同)
  • 时间是 2029 年。这些机器从核火的灰烬中崛起。他们消灭人类的战争只能通过一个程序来阻止——MSBuild 构建一个项目。 (4认同)
  • 这是因为这不是问题,您正在构建 csproj,而不是解决方案 (2认同)
  • 到了2021年,这仍然是一个问题。 (2认同)
  • 到了 2024 年,这仍然是一个问题。好吧,现在还不是 2024 年,但我只是先把这个问题留在这里。 (2认同)

Art*_*tur 10

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

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

<Project>
 <PropertyGroup>
    <SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir>
 </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

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

  • 在 VS 2022 为我工作 (2认同)

Jef*_*ffH 0

您没有指定这种情况是在许多项目中发生还是仅在一两个项目中发生。

如果仅在一两个项目中,临时解决方法可能是将 $(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"
Run Code Online (Sandbox Code Playgroud)

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