首页 > 解决方案 > 如何获得准确的 F# 版本号(例如:4.7.2,而不仅仅是 4.7)

问题描述

我们有一组 .NET Core 项目,其中一部分使用 F#。dotnet restore --locked-mode我们希望使用该选项切换到基于锁定文件还原 NuGet 包。

但是,当我第一次生成锁定文件时,我的同事无法恢复它们。他们收到这样的消息:

C:\Program Files\dotnet\sdk\3.1.301\NuGet.targets(128,5): error NU1004: The packages lock file is inconsistent with the project dependencies so restore can't be run in locked mode. Disable the RestoreLockedMode MSBuild property or pass an explicit --force-evaluate option to run restore to update the lock file. [c:\Projects\Project.sln]

当同事重新生成锁文件(使用dotnet restore --locked-mode --force-evaluate)时,我们发现的唯一变化是在FSharp.Core包中,它从降级4.7.24.7.1。但是,在运行dotnet fsi命令时,我们都只看到... F# 4.7(而不是4.7.1or 4.7.2)。

我们担心这种锁定文件冲突可能会导致我们的 CI/CD 管道出现问题,其中可能安装了不同版本的 F#。是否有可能获得 F# 的确切版本号?或者,至少,从 F# Interactive 版本号推断它?例如:

Microsoft (R) F# Interactive version 10.10.0.0 for F# 4.7
Copyright (c) Microsoft Corporation. All Rights Reserved.

对比

Microsoft (R) F# Interactive version 10.9.1.0 for F# 4.7
Copyright (c) Microsoft Corporation. All Rights Reserved.

或者,是否有另一种选择如何根据提供的锁定文件强制安装特定的 F# 版本?

标签: .net-coref#nugetf#-interactive

解决方案


您在这里混淆了两个版本:

  • F# 语言的版本
  • FSharp.Core 库的版本

主要/次要版本应该对齐,但是核心库有补丁,所以你总是想要最新的补丁版本。

明确指定您的 FSharp.Core 依赖项最简单,如下所示:

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

尽管值得一问您是否真的需要首先这样做。对于应用程序(不是 nuget 包),建议始终使用最新版本进行构建。

FSharp.Core 的版本固定在给定的 SDK 中,因此如果您从相同的 SDK 构建,它始终会恢复相同的版本。我怀疑您和您的同事如果恢复了不同的包版本,可能不会都使用相同的构建工具链。解决此问题的一种方法是使用global.json文件来固定 SDK 版本。


推荐阅读