4

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

当我使用命令行任务时,无法识别该命令。在我的本地机器上,我vcvarsall.bat在使用msbuild. 但我一直无法弄清楚如何在 Azure Devops 中获得该路径。似乎也不是Develop Command PromptAzue Devops 的任务。

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

4

4 回答 4

3

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

命令行版本 1: 在此处输入图像描述

命令行版本 2:

在此处输入图像描述

结果:

在此处输入图像描述

于 2019-03-04T15:46:44.590 回答
2

以受支持的方式执行此操作的最佳方法是使用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 升级了他们的图像并移动了一些东西(确实发生了)。

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

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

可以在项目 wiki 上找到其他语法示例vswhere,包括 PowerShell 的语法。

于 2019-03-04T18:58:40.097 回答
1

如果您有兴趣了解内置 Microsoft 任务如何解析路径,所有 Azure Devops 任务都是开源的。这些是您可能需要查看的路径函数。

于 2019-03-08T14:19:42.400 回答
-1

这是我提出的仅使用内置管道任务的解决方案,它使 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 任务设置截图

创建一个 MSBuild 任务来运行上一个任务生成的项目文件。确保将 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 任务设置截图

PowerShell 任务设置截图

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

流水线任务顺序截图

于 2019-09-13T19:12:33.643 回答