Как запустить msbuild из командной строки с помощью Windows SDK 7.1?

148

Я настраиваю поддержку .NET 4.0 на нашем сервере CI. Я установил .NET 4.0 и инструменты .NET из Windows 7.1 SDK.

В .NET 2.0 и 3.5 это просто работало. В .NET 4, когда я запускаю "Windows SDK 7.1 Command Prompt" из меню "Пуск", он жалуется на

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

Затем, когда я пытаюсь запустить msbuild, я получаю:

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>

Я не могу поверить, что установка среды выполнения и SDK оставит вас с системой, которая не может запускать msbuild ... пропустил ли я какой-то очевидный шаг или неясен Центр обновления Windows, или пора сдаться и начать взламывать системный путь ?

Дилан Битти
источник
Что пытается построить MS Build? Если это проект C ++, убедитесь, что установлены компиляторы x86. Если ваш CI-сервер является Server Core, убедитесь, что вы установили WOW64 (хотя у меня не было успеха с CI на Server Core)
vcsjones
Нет - простые веб-приложения .NET 4.0 на Windows Server 2008 SP1 ...
Дилан Битти,
Эээ, так вы не можете поверить в то, что можете настроить сервер сборки, не заплатив лицензионный сбор? Лицензия VS позволяет установить более чем на одну машину. Я рекомендую вам воспользоваться этим.
Hans Passant
Какое значение %VCTools%установлено для переменной среды? Он должен быть установлен на путь. Есть ли cl.exeна этом пути? Кроме того, вы используете неанглийскую Windows? Я слышал несколько сообщений об этой проблеме при локализованной установке Windows.
vcsjones

Ответы:

301

Чтобы включить msbuildв командной строке , вам просто нужно добавить каталог msbuild.exeустановки на вашем компьютере в PATHпеременную среды.

Вы можете получить доступ к переменным среды:

  1. Щелкните правой кнопкой мыши на компьютере
  2. Щелкните Свойства
  3. Затем нажмите Расширенные настройки системы на левой панели навигации.
  4. В следующем диалоговом окне нажмите Переменные среды.
  5. Прокрутите вниз до PATH
  6. Отредактируйте его, включив в него свой путь к фреймворку (не забывайте " ; " после последней записи здесь).

Для справки, мой путь был C:\Windows\Microsoft.NET\Framework\v4.0.30319

Обновления пути:

Начиная с MSBuild 12 (2013) / VS 2013 / .NET 4.5.1+ и более поздних версий MSBuild теперь устанавливается как часть Visual Studio .

Для VS2015 путь был%ProgramFiles(x86)%\MSBuild\14.0\Bin

Для VS2017 путь был%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin

Для VS2019 путь был%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin

размноженный
источник
2
Я делаю это также, чтобы msbuild всегда был доступен в PowerShell
Вибе Тийсма,
36
Просто не забудьте перезапустить подсказку после добавления нового пути.
Кампиньо
3
Кроме того, после ";" не может быть пробелов. персонаж.
Майкл Фрай
4
Это старый каталог, MSBuild не устанавливается вместе с .NET framework, на самом деле, даже во время вопроса это устаревшая информация. msdn.microsoft.com/en-us/library/hh162058.aspx
JM Becker,
8
Путь изменился для MSBuild 15.0. Теперь он находится в установочном каталоге VisualStudio 2017. Например: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin. См. Docs.microsoft.com/en-us/visualstudio/msbuild/…
Assaf Israel
73

С этого Visual Studio 2013момента он MSbuildвходит в состав Visual Studio. Ранее MSBuild устанавливался как часть. NET Framework.

MSBuild устанавливается непосредственно в % ProgramFiles% . Таким образом, путь к MSBuild может отличаться в зависимости от версии Visual Studio.

Потому что Visual Studio 2015Путь MSBuildесть"%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe"

Потому что Visual Studio 15 PreviewПуть MSBuildесть"%ProgramFiles(x86)%\MSBuild\15.0\Bin\MSBuild.exe"

Кроме того, были добавлены некоторые новые свойства MSBuild, а некоторые изменены. Для получения дополнительной информации смотрите здесь

Обновление 1: VS 2017

Расположение MSBuild снова изменилось с выпуском Visual Studio 2017 . Теперь каталог установки находится в папке %ProgramFiles(x86)%\Microsoft Visual Studio\2017\[VS Edition]\MSBuild\15.0\Bin\. Поскольку у меня выпуск Enterprise, расположение MSBuild для моей машины"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSbuild.exe"

Абхинав Галодха
источник
8

Использование «командной строки разработчика для Visual Studio 20XX» вместо «cmd» автоматически установит путь для msbuild без необходимости добавлять его в переменные среды.

ДавГарсия
источник
1
Нет (по крайней мере, в среде, где установлен только msbuild, но не Visual Studio)
Еж
6

Ваш файл bat может быть таким:

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

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

PAUSE

EXIT
Мохит Маратт
источник
1
Указание полного пути к msbuild означает, что вы можете искать файл проекта в текущем каталоге, а не жестко его кодировать. Что-то вроде этого C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild *.*projможет сделать это, хотя обратите внимание, что путь для более новых версий MSBuild (около 2013 года) отличается.
jpaugh
6

Для Visual Studio 2019 (по крайней мере, Preview) он сейчас находится в:

C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Preview \ MSBuild \ Current \ Bin \ MSBuild.exe

Я полагаю, что процесс будет аналогичным для официального выпуска 2019 года.

кайфа
источник
Верный. В Visual Studio 2019 путь - C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MsBuild.exe.
eddex
2

Чтобы иметь возможность строить с синтаксисом C # 6, используйте это в пути:

C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin

Мортен Хольмгаард
источник
-3

SetEnv.cmdСценарий , что «команда SDK стремительный» ярлык бежит проверяет cl.exeв различных местах до создания записи для добавления PATH. Таким образом, он не может ничего добавить, если не установлен собственный компилятор C.

Чтобы исправить это, примените следующий патч к <SDK install dir>\Bin\SetEnv.cmd. Это также исправит недостающие пути к другим инструментам, расположенным в <SDK install dir>\Binподпапках и. Конечно, вы можете установить компилятор C, чтобы обойти эту ошибку.

--- 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
источник