我正在尝试在Azure Devops上执行msbuild
。因此,我无法使用提供的MSBuild
任务。
当我使用命令行任务时,无法识别命令。在使用vcvarsall.bat
之前,我先在本地计算机上加载msbuild
。但是我一直无法弄清楚如何在Azure Devops中获得该路径。对于Azue Devops来说似乎也不是Develop Command Prompt
的任务。
关于如何从命令行任务或批处理脚本任务中使用msbuild
的任何想法?使用他们的Hosted VS代理。
答案 0 :(得分:1)
答案 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升级其映像并四处移动(确实发生了),您的脚本仍将保持工作状态。
您还可以使用wget
或invoke-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任务设置屏幕截图:
创建一个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任务设置屏幕截图:
这是构建管道中任务顺序的屏幕截图。