使用 devenv 声明式配置 Haskell 开发环境:GHC、Cabal、Stack 与 HLS 全解析
开发工具CLI【免费下载链接】devenvFast, Declarative, Reproducible, and Composable Developer Environments using Nix项目地址https://gitcode.com/gh_mirrors/de/devenv点击查看免费下载本文以 devenv 项目一个基于 Nix 的快速、声明式、可复现、可组合的开发环境工具中的 Haskell 语言支持模块为核心讲解如何通过languages.haskell.*一组 Nix 选项一键搭建包含 GHC 编译器、Cabal、Stack 与 Haskell Language ServerHLS的完整 Haskell 开发环境。读完本文你将掌握全部 9 个配置选项的含义与默认值、底层模块如何组装工具链并能针对自己的项目定制编译器版本与构建工具参数。概述一个enable true带来的完整 Haskell 工具链在 devenv 中Haskell 语言支持被封装为languages.haskell模块定义于 src/modules/languages/haskell.nix。只需在devenv.nix中写入{ pkgs, ... }: { languages.haskell.enable true; }运行devenv shell或通过 direnv 自动加载后环境即包含GHC 编译器默认pkgs.ghczlib与hpack默认随编译器一起加入hpack 用于将package.yaml转换为 Cabal 文件Haskell Language ServerHLS默认启用且自动匹配当前 GHC 版本Cabal默认启用来自pkgs.cabal-installStack默认启用并自动包装为使用 devenv 提供的 GHC。文档层面该模块对应的完整选项参考由docs/src/individual-docs/languages/haskell.md模板自动生成落地为 docs/src/content/docs/languages/haskell.md下文所有选项说明均以此为准并结合源码逐项展开。核心选项详解从 enable 到各子工具languages.haskell下共有 4 个命名空间9 个可配置选项。所有布尔选项均默认开启除enable外体现出开箱即用的设计取向。languages.haskell.enable类型boolean默认值false示例true作用总开关是否启用 Haskell 开发工具。这是唯一需要手动打开的开关。源码中对应lib.mkEnableOption tools for Haskell development见 haskell.nix。其余子工具Cabal、Stack、HLS虽然在各自命名空间下也有enable但默认均为true因此只要打开总开关即可获得完整工具链。languages.haskell.package类型package默认值pkgs.ghc作用选择要使用的 Haskell 编译器。可通过覆盖 NixOS/nixpkgs 包或直接指向其他 GHC 版本{ pkgs, ... }: { languages.haskell.enable true; languages.haskell.package pkgs.ghc; # 或 pkgs.haskell.compiler.ghc982 等指定版本 }该选项是整套环境的锚点后续 HLS 的版本匹配、Stack 的 GHC 发现都围绕它展开详见下文源码分析。languages.haskell.lsp.enable与languages.haskell.lsp.package类型boolean/package默认值true/pkgs.haskell-language-server作用是否启用 Haskell Language Server以及使用哪个 HLS 包。特别注意HLS 的默认值并非原样使用pkgs.haskell-language-server而是对其进行了一次override将supportedGhcVersions固定为当前选择的 GHC 版本。这保证了语言服务器与编译器严格配套# 源码中的实际默认值构造haskell.nix L38-L46 pkgs.haskell-language-server.override { supportedGhcVersions [ ghcVersion ]; # ghcVersion 为 GHC 版本号去掉小数点如 982 }也就是说只要更换languages.haskell.packageHLS 会自动适配新编译器版本无需手动同步。languages.haskell.cabal.enable与languages.haskell.cabal.package类型boolean/package默认值true/pkgs.cabal-install作用是否启用 Cabal 构建工具以及使用的cabal-install包。Cabal 是 Haskell 生态中最常用的构建工具之一。关闭方式为languages.haskell.cabal.enable false;适用于纯 Stack 工作流。languages.haskell.stack.enable、languages.haskell.stack.package与languages.haskell.stack.args类型boolean/package/list of string默认值true/pkgs.stack/[ --no-nix --system-ghc --no-install-ghc ]作用enable是否启用 Stackpackage使用的 stack 包args传递给 stack 的额外参数。stack.args是三者中信息量最大的选项。文档说明指出默认情况下stack 被配置为使用 devenv 的 GHC 安装。默认参数的三段含义为参数含义--no-nix不使用 stack 内置的 Nix 集成避免与 devenv 的环境叠加产生冲突--system-ghc使用系统即 devenv 环境中已安装的 GHC而不是让 stack 自行下载--no-install-ghc禁止 stack 自动安装 GHC确保始终复用 devenv 提供的编译器这一组合保证了环境里有什么就用什么使构建结果可复现。需要自定义时{ pkgs, ... }: { languages.haskell.enable true; languages.haskell.stack.args [ --no-nix --system-ghc --no-install-ghc --resolver lts-22 ]; }注意stack.args的默认值是通过 makeWrapper 将参数烘焙进可执行文件的见下文因此覆盖该列表会整体替换默认参数而不是追加。源码实现剖析工具链如何组装理解 haskell.nix 的实现能让你更准确地预测配置行为。1. Stack 包装器把参数焊进可执行文件Stack 默认参数并非运行时读取的配置而是通过makeWrapper在构建期写入stack可执行文件的包装脚本stackWrapper pkgs.runCommand stack-wrapper { buildInputs [ pkgs.makeWrapper ]; } mkdir -p $out/bin makeWrapper ${cfg.stack.package}/bin/stack $out/bin/stack \ ${lib.concatMapStringsSep \\\n (arg: --add-flags \${arg}\) cfg.stack.args} ;见 haskell.nix即每个stack.args元素都会被展开成一条--add-flags arg最终得到等价于stack --no-nix --system-ghc --no-install-ghc ...的执行效果。这解释了为何覆盖stack.args会整体替换默认行为——包装器在编译环境时已经定型。2. GHC 版本号处理ghcVersion是把所选 GHC 的版本号去掉小数点后的字符串用于 HLS 的supportedGhcVersions匹配ghcVersion lib.replaceStrings [ . ] [ ] cfg.package.version;例如 GHC 9.8.2 →982。这正是 HLS 默认值与 GHC 自动配套的机制来源haskell.nix。3. 最终加入环境的包集合packages with pkgs; [ cfg.package # GHC zlib # 常见 Haskell 项目的链接依赖 hpack # package.yaml - .cabal 转换工具 ] (lib.optional cfg.lsp.enable cfg.lsp.package) (lib.optional cfg.cabal.enable cfg.cabal.package) (lib.optional cfg.stack.enable stackWrapper);见 haskell.nix可以清晰看到GHC、zlib、hpack 是无条件加入的HLS、Cabal、Stack 则各自受enable开关控制其中 Stack 加入的是经过包装的stackWrapper而非裸包。lib.optional的语义是条件为真时放入单个元素因此三个开关的关闭都能精确地从环境里移除对应工具。4. 历史选项兼容languageServer→lsp.package模块还通过mkRenamedOptionModule提供了旧配置的平滑迁移imports [ (lib.mkRenamedOptionModule [ languages haskell languageServer ] [ languages haskell lsp package ]) ];见 haskell.nix如果你曾经写过languages.haskell.languageServer ...在新版 devenv 中会被自动重定向到languages.haskell.lsp.package既不会报错也不影响行为只是推荐按新路径书写。实战三个常见配置场景场景一最小可用环境{ pkgs, ... }: { languages.haskell.enable true; }等价于显式写出全部默认值适合跟随教程快速起步。场景二指定 GHC 版本并让 HLS 自动跟随{ pkgs, ... }: { languages.haskell.enable true; languages.haskell.package pkgs.haskell.compiler.ghc982; # 示例9.8.2 # HLS 会自动 override supportedGhcVersions [ 982 ] }场景三纯 Cabal 工作流关闭 Stack或纯 Stack 工作流关闭 Cabal{ pkgs, ... }: { languages.haskell.enable true; languages.haskell.stack.enable false; # 只用 Cabal # 或反过来 # languages.haskell.cabal.enable false; # 只用 Stack }进入环境后即可直接使用ghc、cabal build、stack build、hpack、haskell-language-server等命令配合 devenv 的processes与tasks模块还可以进一步把 GHCi、测试命令声明为可复现的自动化流程。相关资源选项完整参考自动生成docs/src/content/docs/languages/haskell.md模块源码src/modules/languages/haskell.nix语言支持总览示例其中languages.haskell.enable trueexamples/supported-languages/devenv.nix小结languages.haskell模块以一个总开关 三个默认开启的子工具的形式把 GHC、Cabal、Stack、HLS 及配套的 zlib/hpack 组装成一致的开发环境。其实现要点在于HLS 通过版本号去点匹配 GHC、Stack 通过 makeWrapper 固化参数以复用 devenv 的编译器、旧选项通过mkRenamedOptionModule自动迁移。掌握这组选项后你就可以像管理其他语言一样用声明式 Nix 配置获得可复现的 Haskell 开发体验。赞分享开发工具CLI【免费下载链接】devenvFast, Declarative, Reproducible, and Composable Developer Environments using Nix项目地址https://gitcode.com/gh_mirrors/de/devenv点击查看免费下载相关推荐GitHub_Trending/ki/kickstart.nvim与Haskell开发Stack与Cabal配置GitHub_Trending/ki/kickstart.nvim与Haskell开发Stack与Cabal配置 引言Haskell开发环境的痛点与解决方案开发工具代码编辑器devenv 中 Dart 开发环境的声明式配置languages.dart 模块详解devenv 中 Dart 开发环境的声明式配置languages.dart 模块详解 导读 本文讲解如何在 devenv https://link.gitc开发工具CLIdevenv 中 Haskell 开发环境配置指南languages.haskell 选项全解析devenv 中 Haskell 开发环境配置指南 languages.haskell 选项全解析 本文以 devenv 项目中的语言模块文档 docs/sr开发工具CLI上一篇Mermaid Live Editor实战指南打造实时图表编辑的终极工作流下一篇如何自托管部署OpenReplayDocker Compose与Kubernetes等5种方式完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

27B模型压缩至5.95GB保留98.2%性能的量化实战解析

27B模型压缩至5.95GB保留98.2%性能的量化实战解析

我平时刷Hugging Face趋势榜,基本是看个热闹就划走了,但这次这个项目我盯着看了好一会儿:27B模型压到5.95GB,还保留98.2%的“智商”,直接登顶趋势榜第一。第一反应是不太信,毕竟27B全精度光权重就有54GB&am…

2026/9/29 5:55:11 阅读更多 →
DeepSeek-V3-0324 实战评测:Function Calling 与 Agent 场景下的配置与验证

DeepSeek-V3-0324 实战评测:Function Calling 与 Agent 场景下的配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 5:54:11 阅读更多 →
反向学习增强差分进化算法:原理、实现与工业落地

反向学习增强差分进化算法:原理、实现与工业落地

1. 什么是“进化算法——反向学习”?它不是新算法,而是一次精准的手术式改良你点开这个标题,大概率是被“反向学习”四个字勾住了——听起来像AI界的新鲜血液,又带点哲学意味:既然正向走不通,那就倒着来&am…

2026/9/29 5:54:11 阅读更多 →

最新新闻

Windows Server 2012 R2远程桌面多用户并发配置全指南

Windows Server 2012 R2远程桌面多用户并发配置全指南

1. 为什么默认装完Windows Server 2012 R2根本不能多人同时远程登录?刚接手一台新部署的Windows Server 2012 R2物理机,客户急着要让5个部门主管同时远程接入做报表——我连RDP连接都还没点开,就发现事情不对劲:第一个用户登录后&…

2026/9/30 7:59:33 阅读更多 →
鸿蒙Flutter隐式动画实战:AnimatedContainer原理与调试

鸿蒙Flutter隐式动画实战:AnimatedContainer原理与调试

1. 项目缘起:在鸿蒙上做 Flutter 动画,到底难不难把 Flutter 的 AnimatedContainer 拿到鸿蒙跨平台开发里讲,这是很多人第一眼觉得“有什么好讲”的话题。但真在鸿蒙设备上跑起来后你会发现,动画不生效、跳变、掉帧这类问题&#…

2026/9/30 7:59:33 阅读更多 →
Flutter AnimatedContainer隐式动画原理与鸿蒙适配实践

Flutter AnimatedContainer隐式动画原理与鸿蒙适配实践

Flutter 的隐式动画组件我差不多每天都在用,但真正让我对它彻底改观,是在把项目往鸿蒙上迁移的时候。原本以为这种“属性变化自动补间”的封装会带来额外性能损耗,实测下来反而成了跨端一致性最好的部分——不管是在 Android、iOS 还是鸿蒙上…

2026/9/30 7:59:33 阅读更多 →
SRC漏洞挖掘实战指南:从零基础到稳定赚取赏金的完整路径

SRC漏洞挖掘实战指南:从零基础到稳定赚取赏金的完整路径

刚开始挖 SRC 漏洞的时候,很多人以为这是个大牛才能干的事,觉得没有几年渗透功底,连门都摸不到。后来我带过几个零基础的朋友入行,看着他们从连 HTTP 抓包都看不懂,到陆续提交出有效漏洞、拿到第一笔赏金,我…

2026/9/30 7:59:33 阅读更多 →
Windows Server 2012 多用户远程桌面配置全指南

Windows Server 2012 多用户远程桌面配置全指南

简介:本资源是一份面向系统管理员与IT运维人员的Windows Server 2012多用户远程桌面配置实操指南,解决企业环境中单台服务器需支持多人并发远程管理的实际需求。文档详细覆盖三大核心配置:启用远程桌面服务、禁用“用户限制到单独会话”策略、…

2026/9/30 7:59:33 阅读更多 →
用Flask构建校园部门资料管理系统:从需求到部署全流程解析

用Flask构建校园部门资料管理系统:从需求到部署全流程解析

每年开学季,我参与的学生会部门总会陷入同一种混乱:换届后上一届的策划案、制度文件、成员名单散落在好几个人的网盘和QQ群里,想找一份三年前的部门总结,得在聊天记录里翻半天;想统计一下部门成员信息,Exce…

2026/9/30 7:58:33 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →