Запустите 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:

Вот снимок экрана с порядком задач в конвейере сборки.

Другие вопросы по тегам