首页 > 解决方案 > MSBuild 设置属性以影响项目依赖项的恢复/构建

问题描述

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

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

项目一:

<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>与设置标志具有相同的影响吗?

标签: c#.netmsbuild

解决方案


属性定义 True 不应该与设置标志具有相同的影响吗?

否 - 项目 A 中设置的属性不会传播到项目 A 引用的项目,因此当您执行时,项目 C 中未定义dotnet build B.csproj该属性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>


推荐阅读