首页 文章

如何强制堆栈使用更新版本的本地包

提问于
浏览
0

我有一个包A,它使用堆栈生成库 . 该库用于包B(即A是B的cabal文件中列出的依赖包) . B也是用堆栈构建的 . 考虑A中的四种变化情况和B上求解器的使用:

1 - 当A发生变化时,B继续使用旧的A状态 - 这遵循堆栈的保证,编译总是以相同的方式工作,不受其他程序变化的影响 .

2 - 如果软件包A有一个新的版本号,那么堆栈构建在A上,然后堆栈构建B会默默使用新版本 . 我认为这是错误的,因为它违反了保证;它应该继续使用旧版本 .

3 - 如果程序包A在没有新版本号的情况下更改并且在B上运行求解程序,则程序包B将继续使用旧状态 . 我认为这是错的;运行求解器后,保证不适用,应使用新状态 .

4 - 如果包A更改为新版本号并且解算器在B上运行,则B使用新版本 . 这是正确的 .

我无法理解这种行为以及版本号和解算器如何交互 . 如何在没有每次碰撞版本号的情况下控制新状态的使用?如果并行处理两个包,则一直改变版本号是不方便的;运行求解器以将更改从A转换为B并且不运行求解器应该足够,包应该始终重新编译,而与其他包中的更改无关 .

对于开发,我希望有一个(附加)标志我可以在第2种情况下设置堆栈来构建,总是静默地使用依赖包的最新状态(好像会有一个新版本,而不会增加版本号) .

我是否误解了堆栈构建的保证或误解了堆栈的行为?我以前测试的代码很简单,在 github: git@github.com:andrewufrank/test-depProj.git 上 .

这个问题与我之前提出的关于多项目开发中的原子或leksahs行为的问题有关 . 我发现这个问题基本上是 stack build 的行为问题,必须首先澄清 stack build .

为了澄清A的stack.yam

flags: {}
extra-package-dbs: []
packages:
- .
extra-deps: []
resolver: lts-8.13

和B

flags: {}
extra-package-dbs: []
packages:
- .
- ../a
extra-deps: []
resolver: lts-8.13

1 回答

  • 0

    它似乎是一个错误,我报告了它 . 正如@duplode所描述的那样,解决方法是仅在一个项目中执行 stack build 或在 stack-build 时使用 --force-dirty 标志 .

    问题似乎是由cabal的行为引起的,即使包的内容发生了变化,它也会重复使用ID . 堆栈1.4.0中包含一个修复程序 . (参见堆栈问题#2904#3047),但似乎在所有情况下都无效 .

相关问题