Я просмотрел документацию по условной компиляции, но, похоже, речь идет только об изменении настроек при компиляции, а не о том, нужно ли вообще выполнять компиляцию.
Да, msbuild условия должны работать внутри узла <Project>
. По вашему требованию я могу представить только один возможный способ добавления conditions
к первому PropertyGroup
(Condition="'$(VisualStudioVersion)'=='16.0'"
), что-то похожее на этот формат:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Condition="'$(VisualStudioVersion)'=='16.0'">
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.0;net48</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition="'$(VisualStudioVersion)'!='16.0'">
<OutputType>Exe</OutputType>
<TargetFramework>net48</TargetFramework>
</PropertyGroup>
<!-- ... other PropertyGroup with conditions-->
<!--I use this script to confirm that when building the project in VS2017(msbuild15.0),the VS version is 15.0 while in VS2019(msbuild16.0), VS version is 16.0-->
<Target Name="TestVersion" AfterTargets="build">
<Message Text="version=>$(VisualStudioVersion)" Importance="high"/>
</Target>
</Project>
Должен сказать большинство изВ то время мы используем Multi-target для проектов библиотек классов, а не для консольных проектов, не зная о вашей конкретной причине сделать это ... Надеюсь, это поможет:)
Обновление:
Для сборки .net
проектов, когда VS не установлен, мы можем рассмотреть возможность использования Build Tools for VS package
, вот ссылка инструментов сборки для VS2019 (содержит msbuild 16.0). В All downloads=>Tools for VS2019
мы можем найти пакет инструментов сборки.
Чтобы убедиться, что мы можем использовать msbuild.exe из этого пакета для сборки консольных проектов .net framework4.8 и .net core3.0, убедитесь, что мывключил эти рабочие нагрузки и компоненты при установке:
Мы можем перейти к Individual Components
чтобы убедиться, что .net core 3.0 и .net 4.8 включены.