我有一个针对多个框架的项目,在我的
<TargetFrameworks>
文件中使用 .csproj
(复数)。
这工作正常,但我无法在
.csproj
中执行特定于框架的操作,因为 $(TargetFramework)
属性始终为空。
如果我使用
<TargetFramework>
(单数)定位单个框架,一切都会按预期工作。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net5.0;net6.0;net7.0</TargetFrameworks>
</PropertyGroup>
<Target Name="DoSomethingFrameworkSpecific" AfterTargets="Build">
<Message Text="$(TargetFramework)" /><!-- Empty string -->
</Target>
<ItemGroup>
<None Include="MyProject.targets">
<Pack>True</Pack>
<PackagePath>build\$(TargetFramework)</PackagePath><!-- File ends up in \build, not build\net5.0 etc -->
</None>
</ItemGroup>
</Project>
我的印象是 MSBuild 会为每个通道(即每个框架)传递当前框架版本,以便我们可以根据正在构建的版本执行特定于框架的路径或其他条件等操作?
官方文档表明这是可能的:https://learn.microsoft.com/en-us/dotnet/standard/frameworks#how-to-specify-a-target-framework
SO 的相关问题似乎只处理预处理器指令,而不是在 MSBuild 脚本中获取当前框架版本。
如果您在针对多个 TFM 时需要在 nuget pack 路径中使用
$(TargetFramework)
,请将 <None>
更改为 <TfmSpecificPackageFile>
,否则它将不起作用。默认情况下,nuget 将评估要从外部构建而不是特定于 TFM 的构建打包的文件,但如果您使用 <TfmSpecificPackageFile>
那么它将重新评估来自内部 TFM 特定构建的包项目。