MSBuild设置属性以影响项目依赖项的还原/生成



我有一个共享库,.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="..CC.csproj" />
</ItemGroup>
</Project>

项目B:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<Net48>True</Net48>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..CC.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>不应该具有与设置标志相同的影响吗?

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

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

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

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

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- See https://learn.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>

最新更新