无法为Nix-build项目安装包,构建Obelist项目遇依赖错误求助
解决Obelist项目的Nix编译与依赖问题
看起来你在Obelisk项目的编译和依赖管理上踩了两个常见的坑,我来帮你逐一解决:
1. 处理Control.Monad.Trans模块找不到的错误
你遇到的第一个编译错误,是因为Control.Monad.Trans模块属于transformers包,而非你尝试安装的Control包(这个包完全不是你需要的)。更关键的是:在Obelisk项目里绝对不要用cabal单独安装依赖——Obelisk是通过Nix来管控所有依赖(包括Haskell包和系统依赖)的,cabal无法适配它的定制环境。
正确的修复步骤:
- 检查项目根目录的
default.nix或project.nix文件,确认transformers已被包含在依赖列表中。如果没有,添加进去:# 在项目的build-depends区域添加 build-depends = [ # 其他已有的依赖... pkgs.haskellPackages.transformers ]; - 如果你是用Obelisk模板创建的项目,
transformers通常已经是base的间接依赖,但GHCJS环境偶尔需要显式声明。可以尝试清理缓存后重新编译:nix-shell --run "obelisk clean" nix-build -o frontend-result -A ghcjs.frontend
2. 解决cabal安装时obelisk-route依赖失败的问题
obelisk-route是Obelisk框架的内部私有包,它并没有发布到Hackage公共仓库,所以cabal根本找不到它——这就是直接用cabal new-install失败的核心原因。
正确的做法是:
- 立刻停止用cabal单独操作依赖的尝试,所有依赖管理都通过Nix或Obelisk提供的命令完成。
- 确保你的项目符合Obelisk的规范结构:根目录应有
default.nix、backend、frontend等目录,所有依赖都通过Nix表达式声明。 - 如果是刚启动的项目,建议重新用Obelisk模板初始化,保证环境完全正确:
obelisk init obelist-project cd obelist-project # 把你的现有代码迁移到这个模板项目中
额外实用提示
在Obelisk项目中,所有编译、开发操作都应该用框架提供的命令:
- 启动前端开发服务器:
obelisk run frontend - 启动后端服务:
obelisk run backend - 进入带完整依赖的开发shell:
obelisk shell - 编译生产版本前端:
nix-build -o frontend-result -A ghcjs.frontend
内容的提问来源于stack exchange,提问作者janat08
相关产品推荐
相关产品推荐

