为什么MSBuild只能在开发人员命令提示符下正常工作?

时间:2016-11-26 20:02:54

标签: command-line visual-studio-2015 msbuild

我使用msbuild.exe在本地构建项目,如:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe MyProject.csproj

当我通过开发人员命令提示符执行时,一切都按预期工作。

但是,当我通过标准的命令提示符执行它时,我收到错误消息:

  

导入的项目" C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v12.0 \ WebApplications \ Microsoft.WebApplication.targets"没找到。

如果我查找该文件夹路径,我确实可以验证它无效(我只在机器上安装了VS 2015)。

那么为什么它不能在命令提示符中工作,或者相反:为什么 它在开发人员命令提示符中工作?< / p>

编辑 .csproj 文件几乎是ASP.NET 4网站的Visual Studio 2015默认值,它指定:

<PropertyGroup>
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />

对我而言,如果VisualStudioVersion未设置,似乎默认为 10.0 ,但从错误消息判断它假设VS版本 12.0

我意识到我可以修改 .csproj 文件,将 12 替换为 14 ,但我宁愿不去解决方法,但要理解为什么它在开发人员命令提示符中工作,而不是标准工作。

我猜测它可能与不同的环境变量有关,或者沿着那些行变化?

2 个答案:

答案 0 :(得分:4)

运行开发人员命令提示符时,您基本上从VisualStudio的Tools文件夹运行VsDevCmd.bat,并为您将使用的控制台设置一些环境变量。没有那些msbuild就找不到正确的文件。

例如,它设置了VisualStudioVersion环境变量

@rem VisualStudioVersion
@rem -------------------
@set VisualStudioVersion=14.0

这取决于.csproj,但我怀疑你可能有类似的东西

<PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">12.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> 

因此,如果未定义$(VisualStudioVersion)(并且它在标准命令提示符中获胜),它将使用版本12.当您通过开发者运行它时命令提示符这设置为14,你很高兴。

答案 1 :(得分:0)

Hans Passant在评论中指出了正确的方向,在开发人员命令提示符中键入where msbuild.exe表明它有两个路径到MSBuild:

  

C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin \ MSBuild.exe   C:\的Windows \ Microsoft.NET \框架\ v4.0.30319 \ MSBuild.exe

第一个适用于两个标准命令提示符开发人员命令提示符

第二个(我的构建脚本从注册表中检索到的)仅适用于开发人员命令提示符,可能是Pawel在他的回答中所说的(主要是由于缺少/不同的环境变量)

在我的构建脚本中,我更改了注册表路径...

HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\

为...

HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0\

...并在构建脚本中生成正确的(当前)MSBuild路径。