我有一个包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