【问题标题】:Why does not FSharp.Core.dll contain major version in its name?为什么 FSharp.Core.dll 的名称中不包含主要版本?
【发布时间】:2018-12-06 06:39:51
【问题描述】:

为什么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) 范围内。在我的DAL 项目中引用EF Core 2.2 后,由于版本冲突,整个解决方案停止构建。


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

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

【问题讨论】:

    标签: f#


    【解决方案1】:

    主要语言版本是包中的第一个数字和 F# 4.5 的二进制版本。

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

    【讨论】:

    • 好的,FSharp.Core 什么时候会变成 5.x.y.z?它会与 v. 4.x.y.z 二进制兼容吗?
    • 是的,FSharp.Core 设计为二进制兼容。它不遵循语义版本控制。
    • designed to be binary compatible,这很酷,但是怎么样?你不怕遗产的诅咒吗?
    • 使用名称中包含主要版本号的 Scala 对用户来说是不利的。例如;许多库在其名称中包含 scala 主要版本,并且它是为不同的 scala 版本编译的。但是,如果您认为这是合乎逻辑的结论,我想我们应该为所有依赖版本的所有组合编译一个库。
    • @PavelVoronin 它是二进制兼容的,因为我们非常注意确保没有添加到库或语言破坏二进制兼容性。这并不意味着事情不会有不同的表现(例如,Array 模块可能在较新版本中具有更多功能),但您始终可以在运行时绑定到不同版本的库。从 .NET Framework 4.0 开始就是这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2022-12-03
    • 2011-07-11
    • 1970-01-01
    相关资源
    最近更新 更多