Запустите MSBuild из командной строки в Azure Devops
Я пытаюсь казнить msbuild
на лазурных девопах. Из-за этого я не могу использовать MSBuild
задание предоставлено.
Когда я использую задачу командной строки, команда не распознается. На моей локальной машине я загружаю vcvarsall.bat
прежде чем я использую msbuild
, Но я не смог выяснить, как получить этот путь в Azure Devops. Не кажется Develop Command Prompt
Задача для Azue Devops либо.
Любые идеи о том, как я могу использовать msbuild
из задачи командной строки или задачи Batch Script? Используя их Hosted VS Agent.
3 ответа
Если вы используете Hosted Agent 2017, вы можете запустить msbuild.exe
из задачи командной строки следующим образом:
Версия командной строки 1:
Версия командной строки 2:
Результаты:
Лучший способ сделать это поддерживаемым способом - использовать vswhere
, Следующий фрагмент скрипта установит vswhere (используя chocolatey), а затем запросит реестр установщика, где можно найти msbuild. замещать -latest
с более конкретной версией, если вам это нужно:
choco install vswhere
for /f "tokens=*" %%i in ('vswhere -latest -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe -nologo') do set msbuildpath="%%i"
echo "##vso[task.setvariable variable=msbuildpath]%msbuildpath%"
Это сохранит путь к msbuild в переменную окружения. %msbuildpath%
а также переменная конвейера (для этой стадии) $(msbuildpath)
,
Затем вы можете использовать вторую задачу запуска командной строки и передать $(msbuildpath)
или вы можете просто вызвать MsBuild из той же части скрипта, упомянутой выше, вызвав:
%msbuildpath%
Это гарантирует, что ваш скрипт будет работать, даже если Microsoft обновит их изображения и переместит некоторые вещи (что происходит).
Вы также можете получить здесь, используя wget
или же invoke-webrequest -outfile
из следующего места:
https://github.com/Microsoft/vswhere/releases/latest/download/vswhere.exe
Другие образцы для vswhere
Синтаксис можно найти в вики проекта, включая синтаксис для PowerShell.
Если вам интересно узнать, как встроенная задача Microsoft разрешает путь, все задачи Azure Devops предоставляются с открытым исходным кодом. Это функции пути, которые вы, вероятно, захотите рассмотреть.
Вот решение, которое я придумал, используя только встроенные задачи конвейера, которые делают каталог bin MSBuild доступным в переменной среды path.
Создайте задачу PowerShell для создания проекта MSBuild для записи и вывода в файл интересующих вас переменных (например, MSBuildBinPath)
Сценарий PowerShell
"<Project DefaultTargets=`"DetectMsBuild`">
<ItemGroup>
<OutFile Include=`"`$(MsBuildDetectionFile)`" />
<OutFile Condition=`"'`$(OutFile)' == ''`" Include=`"msbuildInfo.json`" />
</ItemGroup>
<Target Name=`"DetectMsBuild`">
<PropertyGroup>
<MsBuildPaths>
[{
`"Name`": `"BinPath`",
`"Value`": `"`$(MSBuildBinPath.Replace('\', '\\'))`"
}]
</MsBuildPaths>
</PropertyGroup>
<WriteLinesToFile
File=`"@(Outfile)`"
Lines=`"`$(MsBuildPaths)`"
Overwrite=`"true`"
Encoding=`"UTF-8`" />
</Target>
</Project>" | Out-File -FilePath "msbuilddetect.proj" -Encoding utf8
Установите рабочий каталог и любые переменные соответственно.
Снимок экрана с настройками задачи PowerShell:
Создайте задачу MSBuild для запуска файла проекта, созданного предыдущей задачей. Убедитесь, что для версии MSBuild задана та версия, которую вы хотите использовать.
Снимок экрана настроек задачи MSBuild:
Наконец, создайте еще одну задачу PowerShell, которая будет анализировать выведенный файл JSON с извлеченными переменными и соответствующим образом устанавливать переменные среды.
Сценарий PowerShell
Write-Host "Current path: $($env.Path)`n`n"
$msBuildVariables = Get-Content -Path msbuildInfo.json | ConvertFrom-Json
$Path = "$($msBuildVariables[0].Value);$($env:Path)"
Write-Host "##vso[task.setvariable variable=Path;]$Path"
Снимок экрана с настройками задачи PowerShell:
Вот снимок экрана с порядком задач в конвейере сборки.