如何在 MSBuild 中为 TargetFramework 设置操作系统条件

问题描述

我的解决方案中的项目很少 - 很少有用于移动设备 (Xamarin.Forms) 和一个 xUnit。 xUnit 使用 .NET5 构建并引用移动项目。

Azure DevOps 上有 2 个管道来构建移动应用程序。一种适用于 Android,可在 Windows 上运行,另一种适用于 iOS,可在 OSX 上运行。

将新 NuGet 添加到移动项目 (Rg.Plugins.Popup) 后,xUnit 项目构建开始失败。

最初,为 xUnit 项目设置 TargetFramework 看起来像这样

<PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <IsPackable>false</IsPackable>
</PropertyGroup>

该设置适用于 OSX,但不适用于 Windows,并显示错误消息 Error NETSDK1136: The target platform must be set to Windows (usually by including '-windows' in the TargetFramework property) when using Windows Forms or WPF,or referencing projects or packages that do so.

改成

<PropertyGroup>
    <TargetFramework>net5.0-windows</TargetFramework>
    <IsPackable>false</IsPackable>
</PropertyGroup>

修复了 Windows 问题,但它在 OSX 上开始失败(出现相同的错误消息,这很奇怪,因为我们不再使用 Windows)。

我尝试了一些其他选项,但无法在两台机器上都成功。

<PropertyGroup>
    <TargetFramework Condition=" '$(OS)' == 'Windows_NT' ">net5.0-windows</TargetFramework>
    <TargetFramework Condition=" '$(OS)' != 'Windows_NT' ">net5.0</TargetFramework>
    <IsPackable>false</IsPackable>
</PropertyGroup>
<PropertyGroup>
    <TargetFrameworks>net5.0;net5.0-windows</TargetFrameworks>
    <IsPackable>false</IsPackable>
</PropertyGroup>

我也尝试过 ChooseWhenOtherwise,但看起来您根本无法将 TargetFramework 包裹起来。

我这样做是完全错误还是巧合,正确的代码在我的情况下不起作用?

解决方法

尝试将 Condition 放在 PropertyGroup 而不是 TargetFramework 中。

试试下面的代码


<PropertyGroup Condition=" '$(OS)' != 'Windows_NT' ">
    <TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' "> 
    <TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
</PropertyGroup>