应该使用什么 MSBuild 条件来检测目标 OS?

What MSBuild condition should be used to detect target OS?

应该使用 PropertyGroup/ItemGroup 的什么条件表达式来区分目标 OS(dotnet publish-r 参数)?例如。在这些命令上:

dotnet publish -c Release -r win-x86 --self-contained false
dotnet publish -c Release -r linux-arm --self-contained false

目前我不得不使用不同的配置并使用这些命令进行构建:

dotnet publish -c ReleaseWin32 -r win-x86 --self-contained false
dotnet publish -c ReleaseLinux -r linux-arm --self-contained false

我知道 MSBuild 甚至可以定义目标 .NET Core/Framework 版本(例如 Condition="'$(TargetFramework)' == 'netcoreapp3.1'"),所以可能还应该定义目标 OS(类似于 Condition="'$(TargetOS)' == 'win-x86'") .

是否可能以某种方式直接检测 CSPROJ 文件中的目标 OS,而不使用 -c ReleaseWin32 / -c ReleaseLinux 来构建不同平台?很快,MSBuild 语法是否有任何关于目标 OS 的条件?

CLI 的 -r linux-arm 转换为 MSBUild -property:RuntimeIdentifier=linux-x64 因此您可以在以下条件下使用 $(RuntimeIdentifier)

<PropertyGroup Condition="'$(RuntimeIdentifier)' == 'linux-arm'">
</PropertyGroup>

<ItemGroup Condition="$(RuntimeIdentifier.StartsWith('win'))">
</ItemGroup>