繁体   English   中英

使用MSBuild从64位命令行构建Web应用程序项目:缺少目标文件

[英]Building Web Application project using MSBuild from command line on 64-bit: missing targets file

使用PowerShell中的MSBuild构建包含Web应用程序项目的解决方案,如下所示:

msbuild "/p:OutDir=$build_dir\" $solution_file

在32位上工作正常,但在64位机器上我遇到了这个错误:

错误MSB4019:找不到导入的项目“C:\\ Program Files \\ MSBuild \\ Microsoft \\ VisualStudio \\ v9.0 \\ WebApplications \\ Microsoft.WebApplication.targets”。 确认声明中的路径是否正确,以及该文件是否存在于磁盘上。

我正在使用Visual Studio 2008和powershell v2。 这里这里已经记录这个问题。 基本上在64位安装的VS上,MSBuild所需的Microsoft.WebApplication.targets是在Program Files(x86)目录中,而不是Program Files目录,但是MSBuild不能识别这个,所以看起来错误的地方。

我到目前为止的两个解决方案并不理想:

  1. 手动将64位文件从Program Files(x86)复制到Program Files。 这是一个糟糕的解决方案 - 每个开发人员都必须手动执行此操作。
  2. 手动编辑csproj文件,以便MSBuild在正确的位置查找。 再次不理想:我宁愿不必让64bit上的每个人都在每个新项目上手动编辑csproj文件。

例如

<Import Project="$(MSBuildExtensionsPathx86)\$(WebAppTargetsSuffix)" Condition="Exists('$(MSBuildExtensionsPathx86)\$(WebAppTargetsSuffix)')" />

理想情况下,我想要一种方法告诉M​​SBuild从命令行从正确的位置导入目标文件,但我无法弄清楚如何做到这一点 有解决方案吗

您还有其他几种选择:

由于MSBuild基本上不受环境变量的影响,因此在启动msbuild之前,您可以随时将Program Files更改为ProgramFiles(x86)。

$env:ProgramFiles = ${env:ProgramFiles(x86)}

这应该诱使MSBuild在正确的位置寻找

我能想到的另一种方法是使用Start-Job从脚本中运行MSBuild。 这更像是一个通用的解决方法:

Start-Job {
   Import-Module YourProject
   Start-YourMsBuildProject
} -RunAs32

希望这可以帮助

如果您从32位提示符运行msbuild,这应该可以在64位计算机上进行任何修改。 鉴于此测试文件:

<Project 
   DefaultTargets="Test" 
   xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
   ToolsVersion="3.5">

  <Target Name="Test">
    <Message text="$(MSBuildExtensionsPath)"/>
  </Target>
</Project>

我在x64系统上从32位PowerShell提示符获得此结果:

PS> msbuild test.proj /nologo
Build started 3/26/2010 9:13:10 AM.
Project "C:\temp\test.proj" on node 0 (default targets).
  C:\Program Files (x86)\MSBuild
Done Building Project "C:\temp\test.proj" (default targets).

如果直接从VS运行,这也不应该是一个问题,因为VS是一个32位应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM