Haskell Stack持续触发InvalidRelDir错误的技术求助
解决Windows 10下Haskell Stack的InvalidRelDir错误
问题现象
Windows 10环境中使用Haskell Stack时,除stack --version外,执行stack update、stack clean、stack test、stack path等所有命令均抛出InvalidRelDir错误,错误信息固定指向某个旧项目的.stack-work绝对路径(例如D:\Currentdir\code\.stack-work)。推测是此前删除某项目的.stack-work文件夹后,Stack缓存了该旧路径导致。
已尝试的排查步骤
- 升级Stack至最新版本
- 检查并重新初始化
stack.yaml文件 - 尝试删除
.stack-work目录(执行命令时仍报错) - 修改文件夹读写权限
- 完全卸载并重装Stack(删除
C:\sr及%AppData%\Roaming\stack后重装,问题依旧) - 调整系统变量
STACK_ROOT,设置为C:\sr或C:\sr\.stack-work仍报错
错误示例
PS D:\Currentdir\version2\code> stack update InvalidRelDir "D:\Currentdir\code\.stack-work"
错误原因解析
根据Hackage文档,该错误来自path库的parseRelDir函数,当输入路径不符合相对路径规则时触发。函数定义及异常触发条件如下:
parseRelDir :: MonadThrow m => FilePath -> m (Path Rel Dir) -- 将相对文件路径转换为规范化的相对目录路径 -- 当输入路径满足以下任一条件时抛出InvalidRelDir异常: -- - 不是相对路径 -- - 为空字符串"" -- - 包含表示父目录的..路径组件 -- - 不是合法路径(参考isValid函数)
当前错误是因为Stack错误地将旧项目的绝对路径传入了需要接收相对路径的parseRelDir函数,导致解析失败。
解决方案
1. 清除项目级缓存配置
Stack可能在项目本地的.stack文件夹中缓存了旧路径,执行以下操作:
- 进入当前项目目录,删除
.stack文件夹(如果存在) - 执行
stack init重新初始化项目,让Stack生成新的本地配置
2. 检查并修复环境变量
- 打开系统环境变量设置,查找是否存在
STACK_WORK变量。如果该变量被设置为绝对路径(比如报错中的D:\Currentdir\code\.stack-work),直接删除该变量即可(Stack默认会自动使用当前项目下的.stack-work相对路径)
3. 正确配置STACK_ROOT
STACK_ROOT是Stack的全局根目录,用于存储下载的GHC编译器、包缓存等资源,绝对不能设置为项目内的.stack-work路径:
- 正确的默认路径是
C:\sr,确保该路径是绝对路径,且不包含空格或特殊字符 - 如果之前错误配置了该变量,删除后重启终端,Stack会自动使用默认的全局根目录
4. 彻底清除全局缓存(终极方案)
如果上述方法都无效,执行以下步骤彻底重置Stack:
- 关闭所有打开的Stack终端窗口
- 删除以下目录:
C:\sr(Stack全局资源目录)%AppData%\Roaming\stack(Stack用户配置目录)- 当前项目下的
.stack和.stack-work文件夹
- 重启电脑后重新安装Stack,然后在新项目目录执行
stack new <项目名>创建新项目,或stack init初始化现有项目
内容的提问来源于stack exchange,提问作者Piskator
相关产品推荐
相关产品推荐

