¿Cómo ejecuto msbuild desde la línea de comandos con Windows SDK 7.1?

141

Estoy configurando la compatibilidad con .NET 4.0 en nuestro servidor CI. He instalado .NET 4.0 y las herramientas .NET del SDK de Windows 7.1.

En .NET 2.0 y 3.5, eso simplemente funcionó. Con .NET 4, cuando ejecuto el "Símbolo del sistema de Windows SDK 7.1" desde el menú Inicio, se queja de

The x86 compilers are not currently installed. x86-x86
Please go to Add/Remove Programs to update your installation.
.
Setting SDK environment relative to C:\Program Files\Microsoft
SDKs\Windows\v7.1
\.
Targeting Windows Server 2008 x86 Debug

Luego, cuando intento ejecutar msbuild, obtengo:

C:\Program Files\Microsoft SDKs\Windows\v7.1>msbuild
'msbuild' is not recognized as an internal or external command,
operable program or batch file.

C:\Program Files\Microsoft SDKs\Windows\v7.1>

No puedo creer que instalar el tiempo de ejecución y el SDK te dejarán con un sistema que no puede ejecutar msbuild ... ¿Me he perdido algún paso obvio u oscurezco la actualización de Windows, o es hora de rendirme y comenzar a hackear la ruta del sistema? ?

Dylan Beattie
fuente
¿Qué está tratando de construir MS Build? Si se trata de un proyecto C ++, asegúrese de que los compiladores x86 estén instalados. Si su servidor CI es Server Core, asegúrese de instalar WOW64 (aunque no he tenido éxito al ejecutar CI en Server Core)
vcsjones
No: aplicaciones web simples .NET 4.0 en Windows Server 2008 SP1 ...
Dylan Beattie
Erm, ¿entonces no puedes creer que puedes configurar un servidor de compilación sin pagar la tarifa de licencia? La licencia VS le permite instalar en más de una máquina. Te recomiendo que aproveches eso.
Hans Passant
¿En qué está %VCTools%configurada la variable de entorno? Debe establecerse en una ruta. ¿Existe cl.exeen ese camino? Además, ¿estás en un Windows que no es inglés? He escuchado algunos informes de este problema en la instalación localizada de Windows.
vcsjones

Respuestas:

292

Para habilitar msbuilden Símbolo del sistema , simplemente tiene que agregar la ruta a la instalación de .NET 4 Framework en su máquina a la PATHvariable de entorno.

Puede acceder a las variables de entorno mediante:

  1. Haga clic derecho en la computadora
  2. Haga clic en Propiedades
  3. Luego haga clic en Configuración avanzada del sistema en la barra de navegación izquierda
  4. En el siguiente cuadro de diálogo, haga clic en Variables de entorno
  5. Desplácese hacia abajo para PATH
  6. Edítelo para incluir su ruta al marco (no olvide un " ; " después de la última entrada aquí).

Como referencia, mi camino era C:\Windows\Microsoft.NET\Framework\v4.0.30319

21/03/18 Actualización de ruta:

A partir de MSBuild 12 (2013) / VS 2013 / .NET 4.5.1+ y posteriores, MSBuild ahora está instalado como parte de Visual Studio .

Como referencia, con VS2015 instalado mi máquina, mi ruta es C:\Program Files (x86)\MSBuild\14.0\Bin

propagado
fuente
2
También hago esto para que msbuild esté siempre disponible en PowerShell
Wiebe Tijsma
36
Solo recuerde reiniciar el indicador después de agregar la nueva ruta.
Campinho
3
Además, no puede tener ningún espacio en blanco después de ';' personaje.
Michael Fry
44
Ese es el antiguo directorio, MSBuild no se instala con .NET Framework, en realidad incluso en el momento de la pregunta era información obsoleta. msdn.microsoft.com/en-us/library/hh162058.aspx
JM Becker
8
La ruta ha cambiado para MSBuild 15.0. Ahora está bajo el directorio de instalación de VisualStudio 2017. Por ejemplo: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin. Ver docs.microsoft.com/en-us/visualstudio/msbuild/…
Assaf Israel
73

A Visual Studio 2013partir de ahora, MSbuildviene como parte de Visual Studio. Anteriormente, MSBuild se instaló como parte de. NET Framework.

MSBuild se instala directamente debajo de % ProgramFiles% . Entonces, la ruta para MSBuild puede ser diferente dependiendo de la versión de Visual Studio.

Para Visual Studio 2015, el camino de MSBuildes"%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe"

Para Visual Studio 15 Preview, el camino de MSBuildes"%ProgramFiles(x86)%\MSBuild\15.0\Bin\MSBuild.exe"

Además, se han agregado algunas propiedades nuevas de MSBuild y algunas se han modificado. Para más información mira aquí

Actualización 1: VS 2017

La ubicación de MSBuild ha cambiado nuevamente con el lanzamiento de Visual Studio 2017 . Ahora el directorio de instalación está debajo de %ProgramFiles(x86)%\Microsoft Visual Studio\2017\[VS Edition]\MSBuild\15.0\Bin\. Como tengo una edición Enterprise, la ubicación de MSBuild para mi máquina es"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSbuild.exe"

Abhinav Galodha
fuente
7

El uso del "Símbolo del sistema del desarrollador para Visual Studio 20XX" en lugar de "cmd" establecerá la ruta para msbuild automáticamente sin tener que agregarlo a las variables de entorno.

DavGarcia
fuente
1
No, no lo hace (al menos no en un entorno donde solo está instalado msbuild, pero no en Visual Studio)
Ezh
6

Su archivo bat podría ser como:

CD C:\Windows\Microsoft.NET\Framework64\v4.0.30319

msbuild C:\Users\mmaratt\Desktop\BladeTortoise\build\ALL_BUILD.vcxproj

PAUSE

EXIT
Mohith Maratt
fuente
1
Dar la ruta completa a msbuild significa que puede buscar un archivo de proyecto en el directorio actual, en lugar de codificarlo. Algo así C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild *.*projpodría hacerlo, aunque tenga en cuenta que el camino para las versiones más nuevas de MSBuild (alrededor de 2013) es diferente.
jpaugh
6

Para Visual Studio 2019 (Vista previa, al menos) ahora está en:

C: \ Archivos de programa (x86) \ Microsoft Visual Studio \ 2019 \ Preview \ MSBuild \ Current \ Bin \ MSBuild.exe

Me imagino que el proceso será similar para el lanzamiento oficial de 2019.

kaifas
fuente
Correcto. En Visual Studio 2019 el camino es C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MsBuild.exe.
eddex
2

Para poder construir con la sintaxis C # 6, use esto en la ruta:

C: \ Archivos de programa (x86) \ MSBuild \ 14.0 \ Bin

Morten Holmgaard
fuente
-3

La SetEnv.cmdsecuencia de comandos que ejecuta el acceso directo "símbolo del sistema SDK" comprueba cl.exeen varios lugares antes de configurar entradas para agregar PATH. Por lo tanto, no puede agregar nada si no se instala un compilador de C nativo.

Para solucionarlo, aplique el siguiente parche a <SDK install dir>\Bin\SetEnv.cmd. Esto también reparará las rutas faltantes a otras herramientas ubicadas en <SDK install dir>\Biny subcarpetas. Por supuesto, puede instalar el compilador de C en su lugar para evitar este error.

--- SetEnv.Cmd_ 2010-04-27 19:52:00.000000000 +0400
+++ SetEnv.Cmd  2013-12-02 15:05:30.834400000 +0400
@@ -228,10 +228,10 @@

 IF "%CURRENT_CPU%" =="x64" (
   IF "%TARGET_CPU%" == "x64" (
+    SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\x64;%WindowsSdkDir%Bin\x64;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\amd64\cl.exe" (
       SET "VCTools=%VCTools%\amd64;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\x64;%WindowsSdkDir%Bin\x64;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The x64 compilers are not currently installed.
@@ -239,10 +239,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "IA64" (
+    SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\x64;%WindowsSdkDir%Bin\x64;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\x86_ia64\cl.exe" (
       SET "VCTools=%VCTools%\x86_ia64;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\x64;%WindowsSdkDir%Bin\x64;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The IA64 compilers are not currently installed.
@@ -250,10 +250,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "x86" (
+    SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\cl.exe" (
       SET "VCTools=%VCTools%;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The x86 compilers are not currently installed.
@@ -263,10 +263,10 @@
   )
 ) ELSE IF "%CURRENT_CPU%" =="IA64" (
   IF "%TARGET_CPU%" == "IA64" (
+    SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\IA64;%WindowsSdkDir%Bin\IA64;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\IA64\cl.exe" (
       SET "VCTools=%VCTools%\IA64;%VCTools%;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\IA64;%WindowsSdkDir%Bin\IA64;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The IA64 compilers are not currently installed.
@@ -274,10 +274,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "x64" (
+    SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\IA64;%WindowsSdkDir%Bin\IA64;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\x86_amd64\cl.exe" (
       SET "VCTools=%VCTools%\x86_amd64;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\IA64;%WindowsSdkDir%Bin\IA64;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The VC compilers are not currently installed.
@@ -285,10 +285,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "x86" (
+    SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\cl.exe" (
       SET "VCTools=%VCTools%;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The x86 compilers are not currently installed.
@@ -298,10 +298,10 @@
   )
 ) ELSE IF "%CURRENT_CPU%"=="x86" (
   IF "%TARGET_CPU%" == "x64" (
+    SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\x86_amd64\cl.exe" (
       SET "VCTools=%VCTools%\x86_amd64;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The x64 cross compilers are not currently installed.
@@ -309,10 +309,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "IA64" (
+    SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\x86_IA64\cl.exe" (
       SET "VCTools=%VCTools%\x86_IA64;%VCTools%;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The IA64 compilers are not currently installed.
@@ -320,10 +320,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "x86" (
+    SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\cl.exe" (
       SET "VCTools=%VCTools%;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The x86 compilers are not currently installed. x86-x86
@@ -331,15 +331,17 @@
       ECHO .
     )
   )
-) ELSE IF EXIST "%VCTools%\cl.exe" (
-  SET "VCTools=%VCTools%;%VCTools%\VCPackages;"
-  SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-  SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
 ) ELSE (
-  SET VCTools=
-  ECHO The x86 compilers are not currently installed. default
-  ECHO Please go to Add/Remove Programs to update your installation.
-  ECHO .
+  SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+  SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
+  IF EXIST "%VCTools%\cl.exe" (
+    SET "VCTools=%VCTools%;%VCTools%\VCPackages;"
+  ) ELSE (
+    SET VCTools=
+    ECHO The x86 compilers are not currently installed. default
+    ECHO Please go to Add/Remove Programs to update your installation.
+    ECHO .
+  )
 )

 :: --------------------------------------------------------------------------------------------
ivan_pozdeev
fuente