MSBuild和$(ProgramFiles)以32/64位发出

时间:2011-08-15 15:28:55

标签: visual-studio-2010 msbuild 32bit-64bit

我编写了一个自定义MSBuild任务,它调用SubWCRev.exe,这是一个可执行文件(通常)驻留在C:\Program Files\TortoiseSVN\bin中,无论是32位还是64位,因为TortoiseSVN提供了两个版本。

问题是,Visual Studio 2010只有32位版本。因此,当我的同事使用64位框尝试使用我的闪亮新任务进行构建时,$(ProgramFiles)会解析为C:\Program Files(x86),并且会爆炸说无法找到SubWCRev.exe。因为他们有64位版本的TortoiseSVN,它位于C:\Program Files

有没有比我的msbuild脚本中的C:\Program Files硬编码更好的解决方案,或者每个人都使用32位版本的TortoiseSVN? (实际上它是一个C#项目,我稍微修改了一下MSBuild代码)

2 个答案:

答案 0 :(得分:14)

看看这个:

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

  <Target Name="PrintValues">
    <PropertyGroup>
      <MyProgramFiles>$(ProgramW6432)</MyProgramFiles>
      <MyProgramFiles Condition="$(MyProgramFiles) == ''">$(ProgramFiles)</MyProgramFiles>
    </PropertyGroup>

    <Message Text="MyProgramFiles: $(MyProgramFiles)"/>
  </Target>

</Project>

这使得MyProgramFiles解析为32位和64位Windows的“C:\ Program Files”(非{64}版本的Windows上ProgramW6432环境变量为空。)

答案 1 :(得分:1)

使用MSBuildExtensionsPath属性而不是硬编码路径。

MSDN

  

\ Program Files \或\ Program Files下的MSBuild子文件夹   (x86)文件夹。此路径始终指向相同的Program Files   作为您当前正在运行的窗口的位数。例如,对于a   64位计算机上的32位窗口,路径是Program Files   (x86)文件夹。对于64位计算机上的64位窗口,路径是   Program Files文件夹。另请参见MSBuildExtensionsPath32和   MSBuildExtensionsPath64。

编辑:要访问64位SVN文件夹,请使用:

<PropertyGroup>
   <TortoiseSVNPath>$(MSBuildExtensionsPath64)\..\TortoiseSVN\bin</TortoiseSVNPath>
</PropertyGroup>

另一种方法是检查文件夹是否存在:

<PropertyGroup>
  <TortoiseSVNPath Condition="Exists('$(PROGRAMFILES) (x86)')">$(PROGRAMFILES) (x86)\TortoiseSVN\bin</TortoiseSVNPath>
  <TortoiseSVNPath Condition="$(TortoiseSVNPath) == ''">$(PROGRAMFILES)\TortoiseSVN\bin</TortoiseSVNPath>
</PropertyGroup>