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

时间:2017-05-06 09:11:08

标签: haskell haskell-stack

我有一个包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 :(得分:0)

这似乎是一个错误,我报告了它。 正如@duplode所述,解决方法是仅在一个项目中执行<div class="tab-nav"> <ul> <li class="tab-nav-li"> <span>The first tab</span> </li> <li class="tab-nav-li"> <span>The second tab</span> </li> <li class="tab-nav-li"> <span>The third tab</span> </li> </ul> </div>或在stack build时使用--force-dirty标记。

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