VS Code中.cabal文件保存后自动还原为stack模板问题求助
问题现象
学习《Haskell Programming from First Principles》测试相关章节时出现异常:使用stack创建Haskell项目后,每次在Visual Studio Code中编辑项目对应的.cabal文件,执行保存操作后,文件都会自动回退为stack生成项目时创建的初始模板内容。
已完成的排查操作:
- 关闭编辑器格式化功能后保存文件,问题复现
- 在Mac系统自带备忘录应用中编辑
.cabal文件并保存,重新在VS Code中打开项目,文件依然还原为初始模板
当前VS Code安装的Haskell相关工具:
- 基础Haskell扩展
- Haskell语法高亮扩展
- Haskell调试扩展(目前尚未成功运行调试功能)
- 代码自动格式化工具brittany
根本原因
该问题与VS Code格式化功能、brittany工具均无关,是stack默认启用的hpack自动配置生成机制导致:
通过stack模板新建的项目默认会在根目录生成package.yaml配置文件,只要触发stack相关操作(包括VS Code Haskell扩展自动执行的项目检查、依赖索引操作),stack就会根据package.yaml的内容全量覆盖生成同名.cabal文件,所有直接对.cabal文件的手动修改都会被覆盖,哪怕是在VS Code外部修改的内容也无法保留。
解决方案
根据个人使用习惯二选一即可:
- 方案1(适配stack默认工作流,推荐):不直接编辑
.cabal文件,所有依赖声明、编译选项、模块暴露规则等项目配置,全部修改到项目根目录的package.yaml文件中,保存后hpack会自动生成匹配的.cabal文件,不会出现内容回退问题。 - 方案2(需手动维护.cabal文件时使用):
- 删除项目根目录下的
package.yaml文件 - 打开项目根目录的
stack.yaml文件,添加配置项hpack: false,关闭stack自动生成.cabal文件的功能 - 配置生效后再编辑
.cabal文件,保存后内容不会再被自动覆盖
- 删除项目根目录下的
注意:选择方案2后,所有项目配置变更都需要手动修改.cabal文件完成,stack不会再自动同步配置内容。
内容的提问来源于stack exchange,提问作者Corune
相关产品推荐
相关产品推荐

