在Azure Devops中从命令行任务运行MSBuild

时间:2019-03-04 15:16:17

标签: msbuild azure-devops azure-pipelines azure-devops-hosted-agent

我正在尝试在Azure Devops上执行msbuild。因此,我无法使用提供的MSBuild任务。

当我使用命令行任务时,无法识别命令。在使用vcvarsall.bat之前,我先在本地计算机上加载msbuild。但是我一直无法弄清楚如何在Azure Devops中获得该路径。对于Azue Devops来说似乎也不是Develop Command Prompt的任务。

关于如何从命令行任务或批处理脚本任务中使用msbuild的任何想法?使用他们的Hosted VS代理。

4 个答案:

答案 0 :(得分:1)

如果您使用Hosted Agent 2017,则可以通过以下方式从命令行任务中运行msbuild.exe

命令行版本1: enter image description here

命令行版本2:

enter image description here

结果:

enter image description here

答案 1 :(得分:1)

以受支持的方式执行此操作的最佳方法是使用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升级其映像并四处移动(确实发生了),您的脚本仍将保持工作状态。

您还可以使用wgetinvoke-webrequest -outfile从以下位置获取vswhere:

https://github.com/Microsoft/vswhere/releases/latest/download/vswhere.exe

其他samples for vswhere syntax can be found on the project wiki,包括PowerShell的语法。

答案 2 :(得分:1)

如果您有兴趣了解内置的Microsoft任务如何解析路径,则所有Azure Devops任务都以开源方式提供。这些是您可能希望查看的path functions

答案 3 :(得分:0)

这是我仅使用内置管道任务想到的解决方案,这使MSBuild bin目录在路径环境变量中可用。

创建一个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任务设置屏幕截图

PowerShell task settings screenshot

创建一个MSBuild任务以运行由上一个任务生成的项目文件。确保将MSBuild版本设置为要使用的版本。

MSBuild任务设置屏幕截图

MSBuild task settings screenshot

最后,创建另一个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任务设置屏幕截图

PowerShell task settings screenshot

这是构建管道中任务顺序的屏幕截图。

Pipeline task order screenshot