MSBuild 设置 属性 以影响 Restore/Build 的项目依赖项

MSBuild Set Property to Influence Restore/Build of Project Dependencies

我有一个共享库需要被 .Net 5 和 .Net Framework 4.8 项目使用。由于构建过程中的其他复杂性,不可能简单地在共享库中定义多个TargetFrameworks,所以我想使用一个MSBuild 属性来动态设置共享库应该以 .Net 5 或 .Net Framework 4.8 为目标。当我通过 MSBuild (/p:Net48=True) 传递标志 属性 时,此方法有效,但当我直接在 csproj 文件中定义 MSBuild 属性 时,此方法无效。

下面是我正在尝试做的一个简单示例:

项目 A:

<Project Sdk="Microsoft.NET.Sdk">

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

  <ItemGroup>
    <ProjectReference Include="..\C\C.csproj" />
  </ItemGroup>

</Project>

项目 B:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net48</TargetFramework>
  </PropertyGroup>

  <PropertyGroup>
    <Net48>True</Net48>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\C\C.csproj" />
  </ItemGroup>

</Project>

项目 C(共享库):

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework Condition="'$(Net48)' == ''">net5.0</TargetFramework>
    <TargetFramework Condition="'$(Net48)' != ''">net48</TargetFramework>
  </PropertyGroup>

</Project>

运行 dotnet build B.csproj /p:Net48=True 构建项目,而 dotnet build B.csproj 失败。 属性 定义 <Net48>True</Net48> 不应该与设置标志具有相同的影响吗?

Shouldn't the property definition True have the same impact as setting the flag?

否 - 项目 A 中设置的属性不会传播到项目 A 引用的项目,因此当您执行 dotnet build B.csproj 时,项目 C 中的 属性 Net48 未定义。 但是,在命令行上设置的属性全局应用于所有项目(并优先于 属性 在项目文件中静态设置的值)这就是为什么在命令行上设置它有效。

在这种情况下,您实际上不需要任何特殊的条件逻辑,因为 SDK 样式的项目支持为多个目标框架构建。

只需将项目 C 更改为以下内容:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <!-- See https://docs.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#targetframeworks --> 
        <TargetFrameworks>net48;net5.0</TargetFrameworks>
    </PropertyGroup>

    <Target Name="DisplayTargetInfo" BeforeTargets="Build">
        <Message Importance="high" Text="$(MSBuildProjectName) TargetFramework = $(TargetFramework)" />
    </Target>
</Project>