为什么FSharp.Core.dll的名称中不包含主要版本?

时间:2018-12-05 17:07:23

标签: f#

为什么FSharp.Core.dll的名称中不包含主要版本?解决二进制兼容性问题是否对您有帮助?

就我understand而言,创作用F#开发的库时,应该依赖于FSharp.Core.dll NuGet程序包,其版本上限为<CurrentMajor+1。高版本一定不能不受限制,因为只有在具有相同主版本的库之间才能保证二进制兼容性。只是一个semantic versioning模型。

现在让我们想象一个有用的,没有错误且逻辑上已经完成的库。换句话说,不再需要支持它。期间。

然后F#5被释放,...该库的用户不能再在引用用F#5.x创建的库的项目中使用它。


好的,上面的语句是错误的
(对于F# 2F# 3F# 4 FSharp.Core库,其版本为4.x.y.z。)

尽管如此,问题仍然有效。

在某个时间点,主版本将增加到5。据说这将破坏二进制兼容性。 (为什么不增加呢?)

这是我的意思:
项目引用NuGet.NewNuGet.Old
NuGet.Old个引用FSharp.Core.dll [4.x.y.z, 5.0.0.0)
NuGet.New个引用FSharp.Core.dll [5.0.0.0, 6.0.0.0)
NuGet不允许。这是版本冲突。

实际上,昨天(2018年12月4日)我遇到了类似的问题,当时EF Core 2.2 NuGet软件包已经可用,但是ASP.NET Core 2.2的Sdk没有。

Micrsofot.AspNetCore.App元软件包将EF Core的固定版本固定为[2.1.0, 2.2.0)。在我的EF Core项目中引用2.2 DAL后,由于版本冲突,整个解决方案停止了构建。


但是,如果是FSharp4.Core.dllFSharp5.Core.dll,它们可以并排工作。

是的,代表F#4.x和F#5.x相同概念的CLR类型的约定和形状可以不同,但​​是编译器可以用其主要版本标记类型。这不仅有助于将新对象与旧对象区分开,还可以使新编译器以静默方式创建用于使旧类型适应新版本的代码。

1 个答案:

答案 0 :(得分:4)

从F#4.5开始,主要语言版本是程序包中的第一个数字和二进制版本。

FSharp.Core是二进制兼容的。在您的方案中,F#5的用户仍然可以使用较早的库。不这样做将是一个错误。