0

我正在为我的项目使用替代版本编号方法。我遇到了奇怪的行为,cabalstack让我无法充分享受这种方法的好处。两者都cabal强制stack版本为 format IntInt. Int,这不包括我用于分支的另一种版本格式(0.x.x、、、1.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" 5stack init

有没有办法禁用版本解析cabalstack命令?有它的标志吗?cabal还是我必须向and的开发人员请求这种更改(添加标志、禁用版本解析)stack

为什么有任何解析?它对构建包有什么帮助?是否会cabalstack自动增加某些事件的内部版本号?如果是,我在哪里可以阅读更多关于此的信息?我如何影响在cabal和中实现版本编号递增的方式stack?我希望 haskell 包的开发人员考虑到替代版本编号方法的可能性。

PS。对于所有感兴趣的人,我想快速总结一下“奇怪”版本号背后的想法,例如0.x.x, 1.x.x, 1.0.x. 我使用带有x's 的版本号来描述允许代码更改的开发流程,而 , , 等版本号1.0.0用于1.1.0描述2.35.46开发的冻结状态(准确地说,它们用于发布的软件版本)。请注意,诸如0.x.01.x.15、之类的版本号2.x.23也是可能的(用于软件的快照/构建),它们意味着代码库已从具有版本号的分支继承0.x.x1.x.x并且2.x.x相应地。

为什么我需要这样的版本号0.x.x1.x.x并且根本不需要2.x.x?简而言之,不同数量x的 代表不同类型的分支。例如,版本号模式N.x.x用于支持分支,而模式N.M.x用于发布分支。支持分支背后的想法是,它们是由于相应代码库的不兼容而创建的。由于相应代码库中的功能冻结而创建了发布分支。例如,由于分支1.0.x中的功能冻结(或发布)而创建了分支1.1.x、、、...。1.2.x1.x.x

我知道这很令人困惑,但我努力建立这种版本编号方法,并且我继续通过我的演示文稿和其他项目来提高对版本编号不一致的认识。一旦您更多地考虑semver 方法的缺陷,这一切都变得有意义(您可以在链接后找到有关此问题的详细幻灯片演示文稿)。但我现在不想为它辩护。就目前而言,我只想cabalstack停止对我的项目执行他们认为的不合理的规则。希望你能帮助我。

4

2 回答 2

2

你不能。版本将被解析为Version

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

Stack 使用 Cabal 作为库,但有自己的Version类型:

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

cabal 和 stack 都没有自定义解析的方法。如果您想使用其他版本类型,您必须编写自己的这些程序的变体。但是话又说回来,此时你并没有赢得任何东西:Hackage 和 Stackage 都不会识别你的包的版本。

所以目前1.x.x是不可能的。您可以交换或类似的东西来缓解问题x99999999话虽如此,尚不清楚cabal install应该安装什么。99999999版本?还是最新的稳定变体?

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

于 2017-07-19T20:20:31.220 回答
1

有没有办法在 cabal 和 stack 命令上禁用版本解析?有它的标志吗?

不。

cabal还是我必须向and的开发人员请求这种更改(添加标志、禁用版本解析)stack

你当然可以问,但是有很多悬而未决的 问题,你不太可能得到任何关注。你必须非常有说服力——有足够的说服力来推翻 20 多年的经验,即当前的版本控制方案基本上是可行的。实际上,如果您希望这种情况发生,您可能必须自己维护这些工具的一个分支,并使用此方案提供一个替代位置来托管包。

为什么有任何解析?它对构建包有什么帮助?

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

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

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

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

就像你之前关于改变社区做事方式的问题一样,我认为对包版本控制政策的修改将非常困难,尤其是像你在这里提出的激进的改变。变革越激进,就必须越谨慎地推动它才能获得牵引力。

老实说,我不知道采取这种动机和讨论的合理场所是什么;也许是 haskell-cafe 邮件列表或类似的。

于 2017-07-19T23:03:51.960 回答