如何获得准确的 F# 版本号(例如:4.7.2,而不仅仅是 4.7)
How to get exact F# version number (e.g.: 4.7.2, not just 4.7)
我们有一组 .NET Core 项目,其中一部分在 F# 中。我们想切换到基于锁定文件恢复 NuGet 包,使用 dotnet restore --locked-mode
选项。
但是,当我第一次生成锁定文件时,我的同事无法恢复它们。他们收到这样的消息:
C:\Program Files\dotnet\sdk.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.2
降级为 4.7.1
.但是,当 运行 dotnet fsi
命令时,我们都只看到 ... F# 4.7
(而不是 4.7.1
或 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# 版本?
一个建议可能是禁用对 FSharp.Core
的隐式引用并将其显式添加到每个项目。为此,您将 属性 添加到您的项目中:
<DisableImplicitFSharpCoreReference>true</DisableImplicitFSharpCoreReference>
我找不到这方面的任何具体文档,但您可以看到 in the source 如何将此引用添加到依赖于 SDK 的版本中,并且设置此 属性 将防止这种情况发生。
一旦禁用,您就可以像添加任何其他包一样添加引用:
<PackageReference Include="FSharp.Core" Version="4.7.2" />
这意味着恢复的版本不再依赖于用于恢复它的 SDK。
你在这里混淆了两个版本:
- F# 语言版本
- FSharp.Core 库的版本
major/minor 版本应该是一致的,但是核心库有补丁,因此您总是需要最新的补丁版本。
明确指定您的 FSharp.Core 依赖项是最简单的方法,如下所示:
<PackageReference Update="FSharp.Core" Version="4.7.2" />
虽然值得一问你是否真的需要首先这样做。对于应用程序(不是 nuget 包),建议始终使用最新版本构建。
FSharp.Core 的版本固定在给定的 SDK 中,因此如果您从相同的 SDK 构建,它总是会恢复相同的版本。我怀疑如果恢复了不同的包版本,您和您的同事可能不会都使用相同的构建工具链。解决此问题的一种方法是使用 global.json
文件来固定 SDK 版本。
我们有一组 .NET Core 项目,其中一部分在 F# 中。我们想切换到基于锁定文件恢复 NuGet 包,使用 dotnet restore --locked-mode
选项。
但是,当我第一次生成锁定文件时,我的同事无法恢复它们。他们收到这样的消息:
C:\Program Files\dotnet\sdk.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.2
降级为 4.7.1
.但是,当 运行 dotnet fsi
命令时,我们都只看到 ... F# 4.7
(而不是 4.7.1
或 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# 版本?
一个建议可能是禁用对 FSharp.Core
的隐式引用并将其显式添加到每个项目。为此,您将 属性 添加到您的项目中:
<DisableImplicitFSharpCoreReference>true</DisableImplicitFSharpCoreReference>
我找不到这方面的任何具体文档,但您可以看到 in the source 如何将此引用添加到依赖于 SDK 的版本中,并且设置此 属性 将防止这种情况发生。
一旦禁用,您就可以像添加任何其他包一样添加引用:
<PackageReference Include="FSharp.Core" Version="4.7.2" />
这意味着恢复的版本不再依赖于用于恢复它的 SDK。
你在这里混淆了两个版本:
- F# 语言版本
- FSharp.Core 库的版本
major/minor 版本应该是一致的,但是核心库有补丁,因此您总是需要最新的补丁版本。
明确指定您的 FSharp.Core 依赖项是最简单的方法,如下所示:
<PackageReference Update="FSharp.Core" Version="4.7.2" />
虽然值得一问你是否真的需要首先这样做。对于应用程序(不是 nuget 包),建议始终使用最新版本构建。
FSharp.Core 的版本固定在给定的 SDK 中,因此如果您从相同的 SDK 构建,它总是会恢复相同的版本。我怀疑如果恢复了不同的包版本,您和您的同事可能不会都使用相同的构建工具链。解决此问题的一种方法是使用 global.json
文件来固定 SDK 版本。