将项目从cabal new-build转Stack后遭遇依赖遮蔽问题求助
这种跨机器的依赖遮蔽问题确实头疼,我之前迁移项目的时候也踩过类似的坑,结合你提到的新版本修复信息,给你整理几个针对性的解决步骤:
优先升级Stack到最新版本
你提到这个问题在Stack新版本中已修复,那首先确认这台机器的Stack版本:stack --version如果版本较旧,直接运行
stack upgrade升级到最新稳定版,这大概率能直接解决问题。彻底清理本地缓存与构建产物
旧的缓存或残留构建文件很可能导致依赖冲突,运行以下命令清空:stack clean --full stack purge清理完成后再重新执行
stack build,让Stack重新拉取并构建一套干净的依赖链。检查
stack.yaml的依赖约束
打开项目根目录的stack.yaml,看看是否手动指定了streaming-commons或conduit-extra的版本。这些手动约束可能和当前resolver自带的依赖版本冲突,进而引发遮蔽问题。如果不是必须的版本要求,可以暂时注释掉这些手动指定,让Stack使用resolver默认的兼容版本组合。强制重新解析依赖树
如果清理缓存后还是报错,强制让Stack重新计算依赖:stack build --rebuild要是你的项目指定了特定resolver,也可以加上resolver参数确保一致性:
stack build --resolver <你的resolver版本> --rebuild这会让Stack忽略之前的解析结果,重新生成无冲突的依赖关系。
排查全局Cabal包的干扰
这台机器可能全局安装了和Stack沙箱冲突的Cabal包,运行以下命令查看全局包:cabal list --global如果发现
streaming-commons或conduit-extra在全局列表里,用下面的命令卸载它们:cabal uninstall --global streaming-commons conduit-extra避免全局包和Stack的沙箱依赖互相遮蔽。
尝试更换Stack Resolver
如果以上方法都无效,可以考虑更换一个更近期的LTS resolver(比如选择比当前版本新的LTS系列),修改stack.yaml中的resolver字段后重新执行stack build。新的resolver通常包含了更协调的依赖版本,能避免这类遮蔽问题。
内容的提问来源于stack exchange,提问作者MichaelO

