为什么FSharp.Core.dll
的名称中不包含主要版本?解决二进制兼容性问题是否对您有帮助?
就我understand而言,创作用F#开发的库时,应该依赖于FSharp.Core.dll
NuGet程序包,其版本上限为<CurrentMajor+1
。高版本一定不能不受限制,因为只有在具有相同主版本的库之间才能保证二进制兼容性。只是一个semantic versioning模型。
现在让我们想象一个有用的,没有错误且逻辑上已经完成的库。换句话说,不再需要支持它。期间。
然后F#5被释放,...该库的用户不能再在引用用F#5.x创建的库的项目中使用它。
好的,上面的语句是错误的
(对于F# 2
,F# 3
和F# 4
FSharp.Core
库,其版本为4.x.y.z
。)
尽管如此,问题仍然有效。
在某个时间点,主版本将增加到5
。据说这将破坏二进制兼容性。 (为什么不增加呢?)
这是我的意思:
项目引用NuGet.New
和NuGet.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.dll
和FSharp5.Core.dll
,它们可以并排工作。
是的,代表F#4.x和F#5.x相同概念的CLR类型的约定和形状可以不同,但是编译器可以用其主要版本标记类型。这不仅有助于将新对象与旧对象区分开,还可以使新编译器以静默方式创建用于使旧类型适应新版本的代码。
答案 0 :(得分:4)
从F#4.5开始,主要语言版本是程序包中的第一个数字和二进制版本。
FSharp.Core是二进制兼容的。在您的方案中,F#5的用户仍然可以使用较早的库。不这样做将是一个错误。