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

4

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

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

在32位机器上可以正常工作,但在64位机器上运行时出现以下错误:

error 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查找正确的位置。同样不理想:我不想让每个64位开发人员在每个新项目中手动编辑csproj文件。

例如:

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

理想情况下,我希望能够通过命令行告诉MSBuild从正确的位置导入目标文件,但是我不知道如何做到这一点。有没有解决方案?

2个回答

2

你还有几个其他的选择:

由于MSBuild基本上是依靠环境变量工作的,因此在启动msbuild之前,您可以将Program Files更改为ProgramFiles(x86)。

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

这样可以欺骗MSBuild查找正确的位置

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

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

希望这可以帮到你。

或者运行 C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat 来设置环境变量。 - Joseph Yaduvanshi
非常好的想法,但我更喜欢Keith的想法,所以我给了他绿色的勾选标记。你需要重新设置环境变量吗?我尽量避免接触它们。我认为你的Start-Job想法很好,这是否意味着使用32位版本的msbuild? - James Allen

1

如果您从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位应用程序。


太棒了!你让我思考,并且调用了位于C:\Windows\Microsoft.NET\Framework文件夹中的32位MSBuild版本(64位MSBuild在Framework64文件夹中),这也可以工作。谢谢! - James Allen
是的,我可能应该提到我已经配置了32位shell来使用vcvarsall.bat(默认使用x86)。我的64位shell将amd64传递给同一批处理文件以配置我的环境。顺便说一句,如果不使用名为Invoke-BatchFile的PSCX函数使vcvarsall.bat所做的环境变量更改对shell永久生效,这是行不通的。 - Keith Hill
顺便提一下,这是我如何配置不同位数的 shell:$vcargs = ?: {$Pscx:Is64BitProcess} {'amd64'} {'x86'}; $VS90VCVarsBatchFile = "${env:VS90COMNTOOLS}....\VC\vcvarsall.bat"; 调用 Invoke-BatchFile $VS90VCVarsBatchFile $vcargs。正如我之前提到的那样,Invoke-BatchFile 是 http://pscx.codeplex.com 的一部分。 - Keith Hill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接