我使用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 ,但我宁愿不去解决方法,但要理解为什么它在开发人员命令提示符中工作,而不是标准工作。
我猜测它可能与不同的环境变量有关,或者沿着那些行变化?
答案 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路径。