我正在尝试msbuild
在 Azure Devops 上执行。因此,我无法使用MSBuild
提供的任务。
当我使用命令行任务时,无法识别该命令。在我的本地机器上,我vcvarsall.bat
在使用msbuild
. 但我一直无法弄清楚如何在 Azure Devops 中获得该路径。似乎也不是Develop Command Prompt
Azue Devops 的任务。
关于如何msbuild
从命令行任务或批处理脚本任务中使用的任何想法?使用他们的托管 VS 代理。
我正在尝试msbuild
在 Azure Devops 上执行。因此,我无法使用MSBuild
提供的任务。
当我使用命令行任务时,无法识别该命令。在我的本地机器上,我vcvarsall.bat
在使用msbuild
. 但我一直无法弄清楚如何在 Azure Devops 中获得该路径。似乎也不是Develop Command Prompt
Azue Devops 的任务。
关于如何msbuild
从命令行任务或批处理脚本任务中使用的任何想法?使用他们的托管 VS 代理。
以受支持的方式执行此操作的最佳方法是使用vswhere
. 以下脚本将安装 vswhere(使用巧克力),然后查询可以找到 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
从以下位置获取 vswhere:
https://github.com/Microsoft/vswhere/releases/latest/download/vswhere.exe
可以在项目 wiki 上找到其他语法示例vswhere
,包括 PowerShell 的语法。
如果您有兴趣了解内置 Microsoft 任务如何解析路径,所有 Azure Devops 任务都是开源的。这些是您可能需要查看的路径函数。
这是我提出的仅使用内置管道任务的解决方案,它使 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 任务设置截图:
创建一个 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 任务设置截图:
这是构建管道中任务顺序的屏幕截图。