MSBuild и $ (ProgramFiles) проблема с 32/64 битами - PullRequest
10 голосов
/ 15 августа 2011

Я написал пользовательскую задачу 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!

Есть ли лучшее решение, чем жесткое кодирование C:\Program Files в моем скрипте msbuild, или когда все используют 32-битную версию TortoiseSVN? (На самом деле это проект на C #, я немного возился с кодом MSBuild)

Ответы [ 2 ]

14 голосов
/ 15 августа 2011

Посмотрите на это так:

<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 преобразовывать в "C: \ Program Files" для 32- и 64-битных Windows (переменная окружения ProgramW6432 пуста на64-битные версии Windows).

1 голос
/ 15 августа 2011

Используйте свойство MSBuildExtensionsPath вместо жесткого кодирования пути.

За MSDN :

Подпапка MSBuild в папке \ Program Files \ или \ Program Files (x86) папка. Этот путь всегда указывает на файлы программы одного и того же битность как окно, в котором вы в настоящее время работаете. Например, для 32-битное окно на 64-битной машине, путь к программным файлам (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>
...