Подтвердить что ты не робот

Как я могу назвать версию MSBuild в Visual Studio 2017 RC из файла BAT?

Более ранние версии MSBuild можно найти здесь: %programfiles(x86)%\msbuild\<version>\bin\msbuild.exe.

Но для Visual Studio 2017RC путь %programfiles(x86)%\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe. Тип установки: enteprise, сообщество или профессионал, кажется, является частью пути. И это затрудняет указание правильного пути к msbuild в BAT файле, который должен работать на разных компьютерах с разными версиями Visual Studio 2017.

Каков наилучший способ вызвать версию Visual Studio 2017 RC Msbuild из файла bat? Или из PowerShell?

4b9b3361

Ответ 1

Microsoft создала инструмент для поиска местоположения Visual Studio 2017 и нового https://github.com/Microsoft/vswhere

Этот параметр и новее описываются в этом сообщении в блоге.

Ответ 2

Поддерживаемый способ

VS2017 имеет встроенный API, который позволяет запрашивать информацию о том, какие экземпляры VS2017 установлены. Там пакет NuGet для него и даже образец как запросить, включая путь установки. Для потребления в пакетном или PS файле вы можете просто переписать пример приложения и вызвать его из своего script для вывода необходимой вам информации.

Неподдерживаемый способ

Механизм установки VS сохраняет хранилище своих данных в %ProgramData%\Microsoft\VisualStudio\Packages\_Instances. Будет папка для каждого экземпляра VS2017, а внутри этой папки находится файл state.json, содержащий информацию об этой установке, включая путь установки.

Поскольку вам нужно извлечь информацию из файла .json, вы можете либо написать приложение, которое вы вызываете из своего файла script, либо придумать логику синтаксического анализа непосредственно в script. Это, очевидно, будет хрупким, поскольку может измениться схема JSON или местоположение файла.

Метод грубой силы

Предполагая, что вы используете путь установки по умолчанию, вы можете просто рекурсивно искать msbuild.exe под %ProgramFiles(x86)%\Microsoft Visual Studio\ (похоже, что для каждого экземпляра VS будет 32-разрядный и 64-разрядный файл msbuild.exe). Это, вероятно, было бы проще всего сделать в вашем файле script, но он полагается на путь установки по умолчанию (или какой-либо жесткий путь, который вы хотите найти).

Измените требования к среде разработки

Последнее, что вы можете сделать, - это потребовать, чтобы разработчики использовали (или каким-то образом) использовать vsdevcmd.bat для использования среды VS dev. Это даст им MSBuild и, кроме того, любые другие инструменты из среды VS, на их% PATH%. Это действительно необходимо для вашей команды разработчиков, но всегда будет официально поддерживаться в поиске msbuild.exe.

Ответ 3

Простейший способ...

В правой части страницы загрузки на VS

  • Profit; инструменты сборки будут устанавливаться в отдельное место, стандартное для всех, где вы его устанавливаете, независимо от вашего VS SKU (профессиональное/корпоративное/сообщество все устанавливает на разные пути).
  • Новое местоположение C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe

Ответ 4

Теперь, когда VS 2017 был выпущен, подумал, что было бы полезно добавить мои 2 цента:

Создание командного файла:

Открыть блокнот

Скопируйте следующее и вставьте в блокнот, заменив решение, которое вы хотите построить, с помощью [My Solution Name Here]:

@echo off

:variables
SET msBuildLocation="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
SET solutionDirectory=[My Solution Location Here]
SET batchFileLocation=[BatchFileLocation Here]

cd %solutionDirectory%

echo Building MS files for [My Solution Name Here].

call %msBuildLocation% [My Solution Name].sln /p:Configuration=Debug /m:4 /v:M /fl /flp:LogFile=msbuild.log;Verbosity=Normal /nr:false  /consoleloggerparameters:Summary;ShowTimestamp;ShowEventId;PerformanceSummary
echo -
echo --------Done building [My solution name here].--------------
echo -

cd %batchFileLocation%

Сохраните пакетный файл так, как хотите, с расширением .bat. Обязательно выберите все файлы вместо .txt, иначе он не будет работать. Вызовите командный файл, выпустив команду cd, где вы ее сохранили, и она должна работать. Или просто дважды щелкните. Готово.

Обратите внимание, что моя версия visual studio - это сообщество; вам нужно будет заменить путь соответствующей версией.

Ответ 5

Я также запускаю инструменты сборки из файла bat на моем CI-сервере: новое местоположение, которое я нашел, следующее:

% программных файлов (x86)%\Microsoft Visual Студия\2017\инструмент сборки \MSBuild\15.0\Bin\msbuild.exe

Ответ 6

Если вы установили предварительный просмотр инструментов .NET Core 3 или более поздней версии, CLI dotnet должен быть доступен по %PATH% по умолчанию (даже если вы не строите проект .NET Core), поэтому вы можете попробуйте dotnet msbuild. Ref https://github.com/dotnet/docs/blob/master/docs/core/preview3/tools/dotnet-msbuild.md

Ответ 7

Проводка этого для людей, которые все еще пытаются найти более новые версии msbuild. Я нахожу, что этот фрагмент powershell делает трюк, который легко может быть вызван из файла bat.

Function Find-MsBuild([int] $MaxVersion = 2017)
{
    $agentPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe"
    $devPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe"
    $proPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\msbuild.exe"
    $communityPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
    $fallback2015Path = "${Env:ProgramFiles(x86)}\MSBuild\14.0\Bin\MSBuild.exe"
    $fallback2013Path = "${Env:ProgramFiles(x86)}\MSBuild\12.0\Bin\MSBuild.exe"
    $fallbackPath = "C:\Windows\Microsoft.NET\Framework\v4.0.30319"

    If ((2017 -le $MaxVersion) -And (Test-Path $agentPath)) { return $agentPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $devPath)) { return $devPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $proPath)) { return $proPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $communityPath)) { return $communityPath } 
    If ((2015 -le $MaxVersion) -And (Test-Path $fallback2015Path)) { return $fallback2015Path } 
    If ((2013 -le $MaxVersion) -And (Test-Path $fallback2013Path)) { return $fallback2013Path } 
    If (Test-Path $fallbackPath) { return $fallbackPath } 

    throw "Yikes - Unable to find msbuild"
}