49

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

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

"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 本身不知道宏。

4

6 回答 6

93

我通过将所有替换$(SolutionDir)$(ProjectDir)..\.

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

于 2013-12-17T15:29:42.217 回答
18

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

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

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

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

于 2020-03-07T14:02:13.800 回答
1

Allan 的回答正好在正确的路径上,但是如果您想移动到 的父目录ProjectDir,或者$(ProjectDir)..\输出将是 a string,则需要在 msbuild 中执行“转到父目录”操作
以下是如何实现这一目标:

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

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

于 2019-01-16T16:55:39.693 回答
1

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

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

相反,我将所有内容替换$(SolutionDir)$(ProjectDir)\..并且正确地上升了一个目录。

于 2021-09-09T01:09:38.023 回答
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"

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

于 2009-03-11T17:20:40.007 回答
0

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

于 2020-08-04T14:19:58.730 回答