首页 > 解决方案 > 有没有办法将 PackageReference 更新为 Directory.Build.targets 中的某个最低版本?

问题描述

使用 .NET Core 5,有没有办法PackageReference通过Directory.Build.targets文件设置最低版本?

我们有一组项目,其中大部分需要使用编译器默认引用的特定版本的包(FSharp.Core)。但是,一两个项目需要更高版本。因此,我们有一个Directory.Build.targets

<ItemGroup>
  <PackageReference Update="FSharp.Core" Version="4.7.2" />
</ItemGroup>

因此,大多数项目文件都不需要提及FSharp.Core,但有一些人想要更高版本,所以他们的项目文件中有这个:

<ItemGroup>
  <PackageReference Update="FSharp.Core" Version="5.0.2" />
</ItemGroup>

但是,该Directory.Build.targets文件随后会按照您的预期降级版本。我不希望它这样做。相反,我希望Directory.Build.targets文件强加4.7.2.

我想我可以把一个只适用于现有的Condition有一个。但我一直无法弄清楚 MSBuild 的做法,并且很快得出结论,它甚至可能是不可能的。PackageReferencePackageReferenceVersion < 4.7.2

这是我目前所处的位置:

<Project>
  <ItemGroup>
    <FSharpCoreReferencesRequiringUpgrading Include="@(PackageReference)" Condition="$(%(Identity)) == 'FSharp.Core'"/>
  </ItemGroup> 

  <ItemGroup>
    <PackageReference Update="FSharp.Core" Version="4.7.2" />
  </ItemGroup>
</Project>

通过使用 MSBuildMessage任务,我一直在尝试找出修改Conditionon所需的咒语FSharpCoreReferencesRequiringUpgrading,以便它:

  1. 过滤掉除FSharp.Core
  2. 过滤掉所有4.7.2或更高的包引用

我被困在第一步,因为像上面那样做一个简单的比较string不起作用,并且尝试调用ToString()or不起作用:IncludePackageReference

<!--
error MSB4184: The expression "%(Identity).ToString()" cannot be evaluated.
-->
Condition="$(%(Identity).ToString()) == 'FSharp.Core'"

有谁知道这是否可能以及如何去做?

更新1:我在这里创建了一个repro

更新 2:我在此处添加了 David Kean (@davkean) 建议的修复示例。但是,我肯定还没有正确实施它,因为我显然误解了他

更新 3:我添加了一个适用于我所有测试的另一个修复示例,这一次是基于@Taskkant here的建议。修复在这里

标签: .net-coremsbuild

解决方案


更新

试试这个Directory.Build.targets

<Project>
  <PropertyGroup Condition="'$(UseHigherFSharpCoreVersion)' != 'true'">
    <FSharpCorePackageVersion>4.7.2</FSharpCorePackageVersion>
  </PropertyGroup>
  
  <PropertyGroup Condition="'$(UseHigherFSharpCoreVersion)' == 'true'">
    <FSharpCorePackageVersion>5.0.2</FSharpCorePackageVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Update="FSharp.Core" Version="$(FSharpCorePackageVersion)" />
  </ItemGroup>
</Project>

然后在fsproj应该使用更高版本的地方:

<PropertyGroup>
  <UseHigherFSharpCoreVersion>true</UseHigherFSharpCoreVersion>
</PropertyGroup>

推荐阅读