我编写了一个自定义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代码)
答案 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>