"dotnet build" 针对多个框架的项目仅构建 "netstandard2.0" 而未生成 nupkg 文件

"dotnet build" on project targeting multiple frameworks is only building "netstandard2.0" and not generating nupkg file

我有一个同时针对 net472netstandard2.0 的项目。当我在 VisualStudio 中构建项目时,两个框架都在输出目录中生成,并按预期生成了一个 .nupkg 文件。

当尝试使用 dotnet build 在 CLI 中构建相同的项目时,它只会构建 netstandard2.0 项目而不是 net472。此外,未生成 .nupkg(可能是因为所有目标都不可用,但我不确定)。

我还有其他项目,其设置方式与此项目相同,但仅针对 netstandard2.0,并且这些项目在使用 dotnet build 时生成 .nupkg

如何让 dotnet 使用这两个框架构建项目并生成 .nupkg 文件?据我了解,除非提供 -f 开关,否则 dotnet build 应该构建所有目标框架。

这里是项目文件的略微修改版本:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net472;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <!-- .NET 4.7.2 only packages -->
  <ItemGroup Condition="'$(TargetFramework)' == 'net472'">
    <PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.7" />
  </ItemGroup>

  <!-- All framework packages -->
  <ItemGroup>
    <PackageReference Include="System.Net.Http" Version="4.3.4" />
  </ItemGroup>

  <!-- Project references -->
  <ItemGroup>
    <!-- Various reference in here -->
  </ItemGroup>

</Project>

附加信息:

dotnet --version: 3.1.300

msbuild -version: 16.5.0.12403

在寻找可能导致此问题的其他构建配置时,我在我的解决方案文件夹中打开 Directory.Build.props 并注意到以下内容:

<!-- SDK Default Framework -->
<PropertyGroup>
  <TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>

因为 TargetFrameworkTargetFrameworks 元素都出现在最终配置中,所以 dotnet build 必须使用 TargetFramework 值并忽略 TargetFrameworks .

我的解决方案是从 Directory.Build.props 中删除该元素并将该元素添加到解决方案中的每个 .csproj

可能还有一个解决方案可以让您从同样使用 TargetFrameworks 的项目中删除 TargetFramework 元素,但我没有花太多时间寻找一个。