2011-08-15 16 views
9

Escribí una tarea personalizada de MSBuild que llama a SubWCRev.exe, un archivo ejecutable que (normalmente) reside en C:\Program Files\TortoiseSVN\bin, ya sean 32 o 64 bits, ya que TortoiseSVN proporciona ambas versiones.

El problema es que Visual Studio 2010 solo tiene una versión de 32 bits. Entonces, cuando mis colegas con un cuadro de 64 bits intentan crear usando mi brillante nueva tarea, $(ProgramFiles) se resuelve en C:\Program Files(x86) y explota diciendo que SubWCRev.exe no se puede encontrar. ¡Porque tienen la versión de 64 bits de TortoiseSVN, que vive en C:\Program Files!

¿Existe una solución mejor que la codificación rígida C:\Program Files en mi secuencia de comandos msbuild o que todos usen la versión de 32 bits de TortoiseSVN? (De hecho, es un proyecto de C#, modifiqué un poco el código de MSBuild)

Respuesta

14

Tome una mirada que esta :

<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> 

Esto permite que resuelva a "C: \ Archivos de programa" para Windows de 32 y 64 bits (la variable de entorno ProgramW6432 está vacía en las versiones de Windows de 64 bits).

+0

Funcionó de inmediato! Muchas gracias –

1

Utilice la propiedad MSBuildExtensionsPath en lugar de hardcoding de la ruta.

por MSDN:

La subcarpeta bajo la MSBuild \ carpeta Archivos de programa (x86) \ Archivos de programa \ o. Esta ruta siempre apunta a los Archivos de programa del mismo bitness como la ventana en la que se está ejecutando actualmente. Por ejemplo, para una ventana de 32 bits en una máquina de 64 bits, la ruta es a los Archivos de programa (x86) carpeta. Para una ventana de 64 bits en una máquina de 64 bits, la ruta es en la carpeta Archivos de programa. Consulte también MSBuildExtensionsPath32 y MSBuildExtensionsPath64.

Editar: Para llegar a la carpeta SVN 64 bits, utilice:

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

Otra forma es comprobar la existencia de carpetas:

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

Lo siento, lo probé y resolvió en C: \ Archivos de programa (x86) \ MSBuild. Estoy seguro de que es una caja de Windows 7 de 64 bits, y Visual Studio es un proceso de 32 bits (recién comprobado con Process Explorer). –

+0

Ese es el comportamiento correcto. Para VS de 32 bits, debería resolverse en 'C: \ Archivos de programa (x86) ...'. ¿Es el MSBuild al final un problema para ti? '$ (MSBuildExtensionsPath) \ ..' dará la carpeta correcta 'Archivos de programa'. – Mrchief

+0

@dario_ramos: Consulte mi respuesta actualizada para ver un ejemplo. – Mrchief

Cuestiones relacionadas