2011-01-20 16 views
16

Tengo un proyecto que funcionaba bien en VS 2008, y luego instalamos y comenzamos a usar TFS Build, y luego lo actualizamos a TFS 2010 Todo estaba bien y se estaba creando correctamente (después de implementar mi nuevo proceso de compilación que hizo que todo fuera muy agradable con una iniciación de compilación con un solo clic desde cualquier cliente remoto de Visual Studio 2010). No fue necesario instalar Visual Studio en Build Agent. Intento mucho (muy difícil) no instalar Visual Studio en Build Agent porque entiendo que no es necesario y no tenemos licencia para instalarlo en un equipo que no sea de desarrollo.Cómo compilar un proyecto MakeFile de VS2010 (vcxproj) con TFS Build (No VS 2010)

Ahora traté de actualizar la solución a VS 2010, todavía apuntando a .NET 3.5 porque es un ensamblado dirigido a los procedimientos CLR de SQL Server, y SQL Server aún no es compatible con .NET 4.0. Pero simplemente no puedo hacerlo construir más bajo TFS Build. Parece que no puedo obtener un mensaje de error consistente de TFS Build y de una línea de comandos de MS Build, pero creo que tiene algo que ver con que Microsoft.Cpp.Targets no esté en C: \ Program Files \ MSBuild \ porque no tengo instaló Visual Studio. Instalé el Microsoft Windows SDK 7.1 para poder ejecutar las herramientas .NET 4.0 SDK como svcutil para algunos otros proyectos .NET 4.0, pero nada parece instalar lo que esta compilación quiere. La acumulación de errores TFS da de mí es:

C: \ TFSBld [...] \ GenerateLanguage \ GenerateLanguage.vcxproj (46,3): error MSB4019: El proyecto importado "C: \ Microsoft.Cpp .Default.props "no se encontró . Confirme que la ruta en la declaración es correcta, y que el archivo existe en el disco.

Y cuando hago clic en ese error que me lleva a la siguiente línea en el archivo vcxproj:

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 

Todo lo que realmente necesito hacer en este proyecto está dirigido resgen para generar archivos de recursos de archivos resx y compilarlos en asambleas satélites. Estaba usando una compilación de makefile para hacer esto, ejecutando manualmente resgen (creo que fue porque no puedo encontrar una manera de compilar montajes de sattelite como una solución independiente de otra manera), y luego los compilo en una DLL (I no puedo recordar cómo funcionó ahora, pero creo que fue manualmente ejecutando AL.exe para compilar archivos DLL de archivos de recursos). Básicamente, solo necesito ejecutar líneas de comando para construir este proyecto, y parece que no puedo encontrar una forma razonable de hacerlo sin descartar todo el proyecto y editar el script de construcción TFS para ejecutar un conjunto de líneas de comando codificadas en lugar. Tiene que haber una mejor manera.

He estado en esto todo el día, e intenté escribir mi propio archivo .targets y hojas de propiedades .xml para tomar el lugar del archivo estándar, pero está muy por encima de mi cabeza. Intenté simplemente borrar las líneas, pero MSBuild se queja de que no hay un objetivo de "compilación". Traté de agregar un archivo ficticio al archivo vcxproj, pero luego no pareció ejecutar los pasos previos y posteriores a la construcción donde todo el trabajo está hecho.

+0

Parece que esta pregunta ya ha sido respondida aquí: http://stackoverflow.com/questions/3043294/how-to-build-a-vs2010-c-project-on-a-buildserver ¿Qué es el forma correcta de actualizar/eliminar esta pregunta? – BlueMonkMN

Respuesta

15

El Microsoft Windows SDK 7.1 tiene varias opciones de instalación. Tener al menos el "Desarrollo de .NET" hijo "Herramientas" marcado aparentemente no es suficiente para construir proyectos de vcxproj, incluso si no incluyen ningún código de C++ (solo pasos previos y posteriores a la construcción). Al agregar la opción "compiladores de Visual C++" y al seleccionar por completo la casilla "Intellisense and Reference Assemblies", se instalan los archivos y la configuración necesarios. No estoy seguro si ambos son necesarios, pero esa combinación funcionó para mí.

2

He ideado un trabajo un tanto complejo pero funcional que involucra los siguientes pasos.

  1. copiar estos archivos de C: \ Archivos de programa (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 en un sistema donde está instalado VS2010 - compruébelo en control de código fuente para que se recuperan como parte de la espacio de trabajo:
    • Microsoft.Build.CPPTasks.Common.dll
    • Microsoft.BuildSteps.targets
    • Microsoft.Cl.Common.apoyos
    • Microsoft.Cpp.Default.props
    • Microsoft.Cpp.props
    • Microsoft.Cpp.targets
    • Microsoft.CppBuild.targets
    • Microsoft.CppCommon.targets
    • Microsoft.Link. Common.props
    • Microsoft.MakeFile.targets
    • Plataformas \ Win32 \ Microsoft.Cpp.Win32.default.props Plataforma
    • s \ Win32 \ Microsoft.Cpp.Win32.props
    • Platfotms \ Win32 \ Microsoft.Cpp.Win32.targets
  2. cambiar el archivo vcxproj para referirse a la ruta relativa en el espacio de trabajo pone esos archivos en lugar de $ (VCTargetsPath).
  3. Cambie las líneas (en todos esos archivos) para usar el atributo AssemblyFile = "Microsoft.Build.CPPTasks.Common.dll" en lugar de referirse a esto utilizando el atributo AsssemblyName.
  4. Elimine "$ (VCTargetsPath) \" en los archivos en la raíz de la nueva ubicación para que encuentre sus archivos hermanos en lugar de intentar hacer referencia a la macro VCTargetsPath inexistente. Puede encontrar las instancias que perdió al intentar ejecutar una compilación de línea de comando con MSBuild en la máquina sin VS 2010 y ver los mensajes de error.
  5. De forma similar, reemplace $ (VCTargetsPath) en archivos de directorios secundarios con rutas de acceso relativas.
  6. Al final de los archivos Microsoft.Cpp.Win32.targets, comente la "< Código VCMessage =" .../> "línea MSB8008" y la siguiente información, relacionada < importación >.
  7. Prueba y error, ejecute la creación de línea de comandos y vea qué más he olvidado mencionar. Creo que fue la mayor parte.
1

una alternativa mejorada a BlueMonkMN es agregar

<PropertyGroup> 
    <VCTargetsPath Condition="'$(VCTargetsPath)' == ''">[path_to_the_fileset_listed]</VCTargetsPath> 
</PropertyGroup> 

como un niño de nivel 1 cerca de la parte superior de la vcxproj.

La ruta puede incluir una variable de entorno o alguna otra variable que contenga una ruta conocida.

Esto hace que sea menos una intrusión y más fácil de revertir que cambiar muchas líneas.

+1

¿Todavía no necesita tener esos archivos Microsoft. * En algún lugar de la máquina? – BlueMonkMN

+0

Sí, los archivos deben estar en algún lugar, pero la ubicación es altamente configurable. Esto es muy útil si desea un control total sobre los archivos, mantenerlos controlados y no alterar los archivos originales. – jesper

+0

Entonces, ¿dónde obtienes los archivos? Tener la ubicación configurable es inútil sin algunos medios para obtener los archivos en esas ubicaciones. – BlueMonkMN

0

Un enfoque aún más sencilla con la adición de una variable de entorno para VCTargetsPath:

  1. Localizar la carpeta CPP msbuild mencionado por BlueMonkMN
    • por ejemploC:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120
  2. variables de entorno
  3. abrir Windows
    • Control Panel > System > Advanced Settings > Advanced > Environment Variables
  4. Agregar una nueva variable de usuario con:
    • Nombre: VCTargetsPath
    • Valor: [su camino hacia los objetivos MSBUILD desde el paso 1 ]
  5. Reinicie Visual Studio.
  6. Hecho. Tu proyecto debe construir ahora.
Cuestiones relacionadas