如何在cabal或堆栈中禁用版本解析?

时间:2017-07-19 19:32:47

标签: haskell cabal haskell-stack version-numbering

我正在为我的项目使用alternative version numbering approach。我遇到了cabalstack的奇怪行为,这些行为不允许我充分享受这种方法带来的好处。 cabalstack强制版本的格式为IntIntInt,但不包括我用于分支的其他版本格式的情况(0.x.x1.x.x1.0.x等)。

如果我的version: 0.x.x文件中有.cabal行,则在运行Parse of field 'version' failed.或运行cabal buildUnable to parse cabal file {PROJECT_NAME}.cabal: NoParse "version" 5时出现stack init错误

有没有办法在cabalstack命令上禁用版本解析?它有旗帜吗?或者我是否必须从cabalstack的开发人员请求此类更改(添加标记,禁用版本解析)?

为什么要进行任何解析?它如何帮助构建包? cabalstack会在某些事件上自动增加内部版本号吗?如果是,我可以在哪里阅读更多相关信息?如何影响cabalstack中版本编号增量的实现方式?我希望haskell软件包的开发人员考虑替代版本编号方法的可能性。

PS。对于所有感兴趣的人,我想快速总结“怪异”版本号背后的想法,例如0.x.x1.x.x1.0.x。我使用x的版本号来描述允许代码更改的开发流程,而1.0.01.1.02.35.46这样的版本号用于描述冻结状态开发(确切地说,它们用于发布的版本的软件)。请注意,0.x.01.x.152.x.23这样的版本号也是可能的(用于软件的 snapshots / builds ),它们意味着代码库已被继承来自版本号为0.x.x1.x.x2.x.x的分支机构。

为什么我需要0.x.x1.x.x2.x.x这样的版本号?简而言之,x的不同数量的不同类型的平均分支。例如,版本号模式N.x.x用于支持分支,而模式N.M.x用于发布分支。 支持分支背后的想法是由于相应代码库的不兼容而导致它们被创建。由于相应代码库中的功能冻结, Release 分支被创建。例如,分支1.0.x1.1.x1.2.x,...是由于分支{{1}中的功能冻结(或发布)而创建的}。

我知道这一切都令人困惑,但我努力建立这种版本编号方法,并通过我的演示文稿和其他项目继续研究版本编号的不一致性。一旦你更多地考虑pitfalls of semver approach(你可以在链接后找到有关此事的详细幻灯片演示),这一切都有意义。但我现在不想为它辩护。目前,我只是希望1.x.xcabal停止强制执行我们的项目中的不合理的规则。希望你能帮助我。

2 个答案:

答案 0 :(得分:2)

你做不到。该版本将被解析为Versionwhich is

data Version = PV0 {-# UNPACK #-} !Word64
             | PV1 !Int [Int]

Stack使用Cabal作为库but has its own Version type:

newtype Version =
  Version {unVersion :: Vector Word}
  deriving (Eq,Ord,Typeable,Data,Generic,Store,NFData)

cabal和stack都没有办法自定义解析。如果要使用其他版本类型,则必须编写自己的程序变体。但话说回来,你还没有赢得任何东西:Hackage和Stackage都不会识别你的软件包的版本。

因此目前无法1.x.x。您可以与x或类似内容交换99999999以缓解此问题。话虽如此,但不清楚应该安装cabal install99999999版本?还是最新稳定的变体?

如果您可以表达语义,对邮件列表的讨论以及功能请求可能会改变(远方)未来的行为,但是现在,您要么必须自己修补程序,要么使用其他编号方案

答案 1 :(得分:1)

  

有没有办法在cabal和堆栈命令上禁用版本解析?它有旗帜吗?

没有

  

或者我是否必须要求cabalstack的开发人员进行此类更改(添加标记,禁用版本解析)?

你当然可以问,但有很多outstanding issues你不太可能获得任何牵引力。你必须非常非常令人信服 - 足以说服推翻超过20年的经验,说当前的版本控制方案基本上是可行的。实际上,如果您希望这种情况发生,您可能必须自己维护这些工具的分支,并提供使用此方案托管软件包的替代位置。

  

为什么要进行任何解析?它如何帮助构建包?

包指定依赖项,并为每个依赖项指定它们使用的版本范围。然后,构建工具使用约束求解器来选择一组连贯的包/版本对,以满足所有(传递)依赖关系。为此,他们必须至少能够检查给定版本是否在给定范围内 - 这需要至少稍微解析版本号。

  

cabal或stack会在某些事件上自动增加内部版本号吗?如果是,我可以在哪里阅读更多相关信息?

没有什么是自动的。但是你应该看看Package Version Policy,它是包维护者之间的社会契约。它允许一个软件包维护者说,“我正在使用bytestring版本0.10.0.1,它似乎有效。我正在考虑限定所有bytestring导入;因此我可以指定一个范围像>=0.10 && <0.11一样,确保事情能够正常运行,同时让bytestring维护者能够将安全性和效率更新推送给我的用户。“无需仔细阅读bytestring的完整文档,并希望其维护者已经写过他的版本号的含义。

  

我如何影响版本编号增量在cabal和堆栈中实现的方式?

正如您之前关于改变社区行事方式的问题一样,我认为修改包版本控制政策将会非常困难,特别是像您似乎在这里提出的那样变化。变化越激进,就越需要获得牵引力。

老实说,我不知道这个动机和讨论会有什么合理的地方;也许是haskell-cafe邮件列表或类似邮件。