我正在为我的项目使用alternative version numbering approach。我遇到了cabal
和stack
的奇怪行为,这些行为不允许我充分享受这种方法带来的好处。 cabal
和stack
强制版本的格式为Int
。Int
。Int
,但不包括我用于分支的其他版本格式的情况(0.x.x
,1.x.x
,1.0.x
等)。
如果我的version: 0.x.x
文件中有.cabal
行,则在运行Parse of field 'version' failed.
或运行cabal build
时Unable to parse cabal file {PROJECT_NAME}.cabal: NoParse "version" 5
时出现stack init
错误
有没有办法在cabal
和stack
命令上禁用版本解析?它有旗帜吗?或者我是否必须从cabal
和stack
的开发人员请求此类更改(添加标记,禁用版本解析)?
为什么要进行任何解析?它如何帮助构建包? cabal
或stack
会在某些事件上自动增加内部版本号吗?如果是,我可以在哪里阅读更多相关信息?如何影响cabal
和stack
中版本编号增量的实现方式?我希望haskell软件包的开发人员考虑替代版本编号方法的可能性。
PS。对于所有感兴趣的人,我想快速总结“怪异”版本号背后的想法,例如0.x.x
,1.x.x
,1.0.x
。我使用x
的版本号来描述允许代码更改的开发流程,而1.0.0
,1.1.0
,2.35.46
这样的版本号用于描述冻结状态开发(确切地说,它们用于发布的版本的软件)。请注意,0.x.0
,1.x.15
,2.x.23
这样的版本号也是可能的(用于软件的 snapshots / builds ),它们意味着代码库已被继承来自版本号为0.x.x
,1.x.x
和2.x.x
的分支机构。
为什么我需要0.x.x
,1.x.x
和2.x.x
这样的版本号?简而言之,x
的不同数量的不同类型的平均分支。例如,版本号模式N.x.x
用于支持分支,而模式N.M.x
用于发布分支。 支持分支背后的想法是由于相应代码库的不兼容而导致它们被创建。由于相应代码库中的功能冻结, Release 分支被创建。例如,分支1.0.x
,1.1.x
,1.2.x
,...是由于分支{{1}中的功能冻结(或发布)而创建的}。
我知道这一切都令人困惑,但我努力建立这种版本编号方法,并通过我的演示文稿和其他项目继续研究版本编号的不一致性。一旦你更多地考虑pitfalls of semver approach(你可以在链接后找到有关此事的详细幻灯片演示),这一切都有意义。但我现在不想为它辩护。目前,我只是希望1.x.x
和cabal
停止强制执行我们的项目中的不合理的规则。希望你能帮助我。
答案 0 :(得分:2)
你做不到。该版本将被解析为Version
,which 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 install
。 99999999
版本?还是最新稳定的变体?
如果您可以表达语义,对邮件列表的讨论以及功能请求可能会改变(远方)未来的行为,但是现在,您要么必须自己修补程序,要么使用其他编号方案
答案 1 :(得分:1)
有没有办法在cabal和堆栈命令上禁用版本解析?它有旗帜吗?
没有
或者我是否必须要求
cabal
和stack
的开发人员进行此类更改(添加标记,禁用版本解析)?
你当然可以问,但有很多outstanding issues你不太可能获得任何牵引力。你必须非常非常令人信服 - 足以说服推翻超过20年的经验,说当前的版本控制方案基本上是可行的。实际上,如果您希望这种情况发生,您可能必须自己维护这些工具的分支,并提供使用此方案托管软件包的替代位置。
为什么要进行任何解析?它如何帮助构建包?
包指定依赖项,并为每个依赖项指定它们使用的版本范围。然后,构建工具使用约束求解器来选择一组连贯的包/版本对,以满足所有(传递)依赖关系。为此,他们必须至少能够检查给定版本是否在给定范围内 - 这需要至少稍微解析版本号。
cabal或stack会在某些事件上自动增加内部版本号吗?如果是,我可以在哪里阅读更多相关信息?
没有什么是自动的。但是你应该看看Package Version Policy,它是包维护者之间的社会契约。它允许一个软件包维护者说,“我正在使用bytestring
版本0.10.0.1
,它似乎有效。我正在考虑限定所有bytestring
导入;因此我可以指定一个范围像>=0.10 && <0.11
一样,确保事情能够正常运行,同时让bytestring
维护者能够将安全性和效率更新推送给我的用户。“无需仔细阅读bytestring
的完整文档,并希望其维护者已经写过他的版本号的含义。
我如何影响版本编号增量在cabal和堆栈中实现的方式?
正如您之前关于改变社区行事方式的问题一样,我认为修改包版本控制政策将会非常困难,特别是像您似乎在这里提出的那样变化。变化越激进,就越需要获得牵引力。
老实说,我不知道这个动机和讨论会有什么合理的地方;也许是haskell-cafe邮件列表或类似邮件。