【问题标题】:Haskell package versioning policy - changes in dependenciesHaskell 包版本控制策略 - 依赖项的变化
【发布时间】:2013-05-30 02:27:58
【问题描述】:

假设我有 libfoo。这取决于 libbar。按照Package Versioning Policy,我指定

libbar ==0.1.*

在 Build-depends: 在我的 cabal 文件中。

然后libbar的开发者发布了一个新版本,0.2。我对其进行了测试,没有影响 libfoo 的更改。所以我将我的 Build-depends 更改为

libbar ==0.2.*

或者也许是

libbar >= 0.1 && < 0.3

虽然我能想到不采用后一种方式的理由。这是我对 libfoo 所做的唯一更改。

libfoo 导出接受 libbar 中定义的类型并返回 libbar 中定义的类型的函数。但是,对 libbar 的更改不会影响任何这些功能。

libfoo 的第一个版本是 0.1.0.0。 libfoo 的第二个版本应该有什么版本号?

【问题讨论】:

    标签: haskell cabal


    【解决方案1】:

    这取决于您从 libbar 重新导出的内容。

    您是否重新导出 libbar?

    不太可能,但是....

    鉴于 libbar 已将其主编号从 0.1 更改为 0.2,因此更改中的某些内容可能会破坏代码,如果您将其重新批发重新导出,您的主编号必须也进行更改: 0.2.0.0

    libbar 0.2 是否声明新实例?

    这是需要提防的。

    您无法阻止实例跨模块边界泄漏,并且新实例可能会破坏现有代码。这就是版本控制政策说的原因

    请注意,修改导入或依赖另一个包的较新版本可能会导致导出额外的实例,从而强制更改主要版本。

    如果 libbar 2.0 中有新实例,您必须拥有一个新的主要版本:0.2.0.0

    否则

    在这种情况下,您的代码不会改变。软件包版本控制政策的第 2 点不适用:

    1. 否则,如果只向接口添加了新的绑定、类型、类或模块(但见下文),则 A.B 可能保持不变,但新的 C 必须大于旧的 C。

    一个基本原则是:

    A.B.C 唯一标识 API。

    您没有添加任何内容或更改任何导出的内容,因此您不需要从 0.1.0 更改主要次要编号,但应该更改最后一部分:0.1.0.1 是对的.

    【讨论】:

    • 实际上,导出新实例何时会破坏现有代码?我可以在客户端代码声明孤儿实例或更新的库导出孤儿实例时看到这种情况——这两种情况都被认为是不好的做法。
    • 正好在孤立实例的情况下,没有其他情况,是的。孤立实例是不好的做法,但是如果有人需要一个不存在的实例,他们会定义它,并且您需要一个新的主要版本号来准确地警告他们他们的代码可能会中断。就像开车一样;你不应该假设其他人都是明智的。
    猜你喜欢
    • 2015-11-22
    • 2019-04-07
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2013-08-01
    相关资源
    最近更新 更多