我认为问题记录在 here moved here,看起来它可能是视觉工作室中的一个错误,但我想知道是否有人知道一种解决方法。
基本上我在prebuild事件中一个接一个地跟随以下两行(除其他外)。
"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本身不知道这些宏。
答案 0 :(得分:60)
我通过将所有$(SolutionDir)
替换为$(ProjectDir)..\
来修复此问题。
这是由于MSBuild独立运行每个项目,因此不是解决方案。它在VS2010中运行良好,但在构建服务器上没有。
答案 1 :(得分:3)
浪费了很多时间来找到完美的解决方案。使用Directory.Build.props。
在您的sln
位置文件夹中,创建一个名称为Directory.Build.props
的文件,并将此代码放入其中:
<Project>
<PropertyGroup>
<SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir>
</PropertyGroup>
</Project>
您的所有csproj
文件都会自动拾取该文件,并将定义(SolutionDir)
属性。
答案 2 :(得分:0)
您没有指定是否会对许多项目或只有一两个项目发生这种情况。
如果只在一个或两个项目中,临时解决方法可能是用Folder2所在的显式路径替换$(SolutionDir)。例如,类似:
"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "C:\AllSolutions\ExampleSolutions\Folder2\Folder3\Project2.csproj"
但是有正确的项目路径。
答案 3 :(得分:0)
Allan的答案正好在正确的路径上,但是如果您想移至ProjectDir
的父目录,或者$(ProjectDir)..\
的输出将成为string
,则需要在msbuild中执行“转到父目录”操作。
这是您可以实现的方法:
<PropertyGroup>
<TrimmedDir>$([System.IO.Path]::GetDirectoryName($(ProjectDir)))</TrimmedDir>
</PropertyGroup>
此代码会将ProjectDir
的父目录路径设置为TrimmedDir
变量。 [System.IO.Path]::GetDirectoryName()
执行此操作。
答案 4 :(得分:0)
如果仅使用MSBuild,SolutionDir适用于某些项目,而不适用于某些项目,则很有可能已经在工作项目的.csproj文件中的某个位置定义了SolutionDir。