Haskell包版本控制策略 - 依赖项的更改

Oma*_*man 10 haskell cabal

假设我有libfoo.这取决于libbar.根据包版本控制策略,我指定

libbar ==0.1.*
Run Code Online (Sandbox Code Playgroud)

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

然后libbar的开发者发布了一个新版本0.2.我测试它并没有影响libfoo的更改.所以我改变了我的Build-depends to

libbar ==0.2.*
Run Code Online (Sandbox Code Playgroud)

或者也许是

libbar >= 0.1 && < 0.3
Run Code Online (Sandbox Code Playgroud)

虽然我可以想到不以后一种方式去做的理由.这是我对libfoo 的唯一改变.

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

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

And*_*ewC 6

这取决于你从libbar重新导出的内容.

你重新导出libbar吗?

不太可能,但....

鉴于libbar已将其主要数字从0.1更改为0.2,因此可能会在更改中破坏代码,如果您重新导出代码,则主要数字必须更改:0.2.0.0

libbar 0.2是否声明了新实例?

这是值得注意的.

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

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

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

除此以外

在这种情况下,您的代码不会更改.包版本控制策略的第2点不适用:

  1. 否则,如果只将新绑定,类型,类或模块(但见下文)添加到接口,则AB可能保持不变,但新C必须大于旧C.

一个基本原则是:

ABC唯一标识API.

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

  • 实际上,何时导出新实例会破坏现有代码?我可以看到这种情况发生在客户端代码声明孤立实例,或者更新的库导出孤立实例 - 这两者都被认为是不好的做法. (2认同)
  • 正好在孤儿实例的情况下,没有其他情况,是的.孤立实例是不好的做法,但是如果有人需要一个不存在的实例,他们将定义它,并且您需要一个新的主要版本号,以警告他们他们的代码可能会中断.这就像开车; 你不应该假设其他人都是明智的. (2认同)