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>
我有一个共享库需要被 .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>