Как условно собрать .Net Core 3.0, только если поддерживается инструментами? - PullRequest
1 голос
/ 04 ноября 2019

Я хотел бы использовать элемент TargetFrameworks .csproj для многоцелевого использования как .Net Core 3.0 (netcoreapp3.0), так и .Net Framework 4.8 (net48) для консольного приложения, например:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFrameworks>netcoreapp3.0;net48</TargetFrameworks>
        <AssemblyName>MyConsoleApp</AssemblyName>
    </PropertyGroup>
</Project>

Однако мне бы хотелось, чтобы тот же файл .csproj изящно ухудшался в старых инструментах и ​​компилировал только .Net Framework 4.8, когда инструмент не поддерживает netcoreapp3.0 (например, в Visual Studio 2017).

Я просмотрел документацию по условной компиляции, но, похоже, речь идет только об изменении настроек при компиляции, а не о том, выполнять ли компиляцию в первую очередь.

Как я могувыполнить это?

1 Ответ

2 голосов
/ 04 ноября 2019

Я просмотрел документацию по условной компиляции, но, похоже, речь идет только об изменении настроек при компиляции, а не о том, нужно ли вообще выполнять компиляцию.

Да, 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, убедитесь, что мывключил эти рабочие нагрузки и компоненты при установке:

enter image description here

enter image description here

Мы можем перейти к Individual Components чтобы убедиться, что .net core 3.0 и .net 4.8 включены.

...