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

时间:2009-03-11 16:35:38

标签: visual-studio-2008 prebuild

我认为问题记录在 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本身不知道这些宏。

5 个答案:

答案 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。