使用 Devbox 在 Haskell 项目中搭建 Stack 开发环境

发布时间:2026/10/2 2:23:04

使用 Devbox 在 Haskell 项目中搭建 Stack 开发环境 开发工具CLI【免费下载链接】devboxInstant, easy, and predictable development environments项目地址https://gitcode.com/GitHub_Trending/dev/devbox点击查看免费下载导读本文基于 Devbox 仓库中的 Haskell 实战示例examples/development/haskell/my-project/README.md讲解如何借助 Devbox 为基于 Stack 工具链的 Haskell 项目构建开箱即用的可复现开发环境。你将掌握从零初始化一个 Stack 项目、在 Devbox Shell 中执行构建与运行、理解devbox.json中 GHC/Stack/Cabal 等关键包的配置以及 Devbox Haskell 插件在底层如何组合这些工具链。示例概览Devbox 中的 Haskell Stack 组合仓库中examples/development/haskell/目录提供了一个完整的 Haskell 开发环境示例。其核心思路是Haskell 项目如果使用 Stack 工具链只需要在 Devbox 中安装 Stack、Cabal 以及编译所需的基础库即可在隔离且可复现的 Shell 中完成全部开发工作参见 examples/development/haskell/README.md。示例项目my-project由stack new生成其结构如下examples/development/haskell/my-project/ ├── app/ # 可执行程序入口 │ └── Main.hs ├── src/ # 库代码 │ └── Lib.hs ├── test/ # 测试套件 │ └── Spec.hs ├── package.yaml # hpack 项目描述Stack 默认生成 ├── my-project.cabal # 由 hpack 从 package.yaml 生成 ├── stack.yaml # Stack 解析器与构建配置 └── stack.yaml.lock入口程序 app/Main.hs 导入库模块并调用someFuncmodule Main (main) where import Lib main :: IO () main someFunc对应的库实现 src/Lib.hs 输出一行文本module Lib ( someFunc ) where someFunc :: IO () someFunc putStrLn someFunc三步复现从零生成一个同款 Haskell 项目示例文档给出了最简单的复现路径——复制devbox.json并运行devbox shell见 examples/development/haskell/my-project/README.md。具体操作如下准备一个工作目录将示例的 devbox.json 复制进去在目录中运行devbox shell激活开发环境Shell 激活后依次执行 Stack 的项目生成、构建与运行命令stack new my-project cd my-project stack build stack exec my-project-exe其中stack new my-project基于默认模板生成新项目骨架即上面展示的目录结构stack build依据stack.yaml中的解析器snapshot解析依赖并编译库、可执行程序与测试套件stack exec my-project-exe运行编译好的可执行程序终端将输出someFunc。示例的devbox.json还内置了一个便捷脚本run_test详见下文配置小节它等价地完成进入项目目录 → 构建 → 运行的全流程devbox run run_test配置详解devbox.json中的 Haskell 工具链示例目录下的 devbox.json 是整套环境的配置核心{ packages: [ ghclatest, gmplatest, stacklatest, cabal-installlatest, zliblatest, hpacklatest ], env: { PATH: $PATH:/usr/bin }, shell: { init_hook: null, scripts: { run_test: [ cd my-project, stack build, stack exec my-project-exe ] } } }各配置项的含义与作用配置项说明packages声明环境所需的软件包。latest后缀表示取最新可用版本如需指定其他版本可用devbox search pkg查询可安装版本参见 examples/development/haskell/README.md。ghcHaskell 编译器。Stack 需要 GHC 才能实际编译源码因此显式安装。gmpGNU 多精度算术库GHC 运行时依赖的底层数学库缺少它编译与运行都会失败。stackStack 构建工具负责解析器snapshot解析、依赖管理与多包构建。cabal-installCabal 包管理与构建系统Stack 的底层依赖stack build最终交由 Cabal 编译。zlibzlib 压缩库是 Stack/Cabal 下载与解析包时可能链接的原生依赖。hpack从package.yaml自动生成.cabal文件的工具stack new生成的模板默认使用 hpack。env.PATH追加/usr/bin到 PATH保证 Shell 内能调用系统级基础命令。shell.scripts定义项目级快捷命令。run_test演示了构建 运行的完整闭环可通过devbox run run_test调用。提示示例目录下还提供了 devbox.lock它精确锁定了各包在四个平台aarch64-darwin、aarch64-linux、x86_64-darwin、x86_64-linux上解析出的 Nix 存储路径这正是 Devbox 环境可复现性的保证——同一份锁文件在任何机器上都会得到完全一致的二进制。从锁文件看版本解析结果devbox.lock 记录了本示例实际解析到的工具链版本可作为latest具体指向的参考包解析版本来源ghc9.10.3Nixpkgs含out、doc两个输出stack2.13.1Nixpkgscabal-install3.16.1.0Nixpkgshpack0.38.3Nixpkgszlib1.3.2Nixpkgs含out、dev、static输出gmp6.3.0Nixpkgs含out、dev、info输出从锁文件可见示例中stack的解析时间2024 年早于其他包2026 年这是因为stacklatest与其余包分别解析自不同时刻的 Nixpkgs commit——这正是 Devbox 按包粒度锁定解析结果的体现。Stack 配置与项目骨架stack.yaml和package.yamlstack.yaml解析器决定工具链版本stack.yaml 是 Stack 项目的核心配置它通过resolver指定 Stackage 快照snapshot从而一次性锁定编译器版本与依赖包集合resolver: url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/20/4.yaml packages: - .resolver指向 LTS-20.4 快照其中定义了 GHC 版本与可用的依赖版本packages声明构建的本地包.即当前目录文件注释中还给出了其他常见用法extra-deps添加快照之外的依赖可固定到 git commit、system-ghc控制是否使用 PATH 中的 GHC、compiler-check允许快照指定的 GHC 更新小版本等。package.yaml 与 hpack 的协作package.yaml 采用 hpack 的 YAML 格式描述包元数据字段与生成的.cabal文件一一对应name: my-project version: 0.1.0.0 dependencies: - base 4.7 5 ghc-options: - -Wall - -Wcompat - -Widentities - -Wincomplete-record-updates - -Wincomplete-uni-patterns - -Wmissing-export-lists - -Wmissing-home-modules - -Wpartial-fields - -Wredundant-constraints library: source-dirs: src executables: my-project-exe: main: Main.hs source-dirs: app ghc-options: - -threaded - -rtsopts - -with-rtsopts-N dependencies: - my-project tests: my-project-test: main: Spec.hs source-dirs: test dependencies: - my-project该文件在构建时由 hpack 生成 my-project.cabal文件头部标注generated from package.yaml by hpack version 0.35.0。关键配置解读dependencies: base 4.7 5指定基础库版本范围一组严格的-Wall警告选项默认开启有助于及早发现潜在问题library.source-dirs: src将src/编译为库模块Lib可执行程序my-project-exe的入口是app/Main.hs并依赖本地库my-project-threaded、-rtsopts、-with-rtsopts-N分别启用多线程运行时、运行时选项与多核并行测试套件my-project-test以 test/Spec.hs 为入口当前为占位实现输出 Test suite not yet implemented。底层原理Devbox Haskell 插件如何组合工具链在 Devbox 中Haskell 环境并非简单地把各包二进制扔进 PATH而是由官方插件plugins/haskell.json注入一个 Nix Flake 来实现包间联动。插件配置声明如下{ name: haskell, version: 0.0.2, description: Haskell plugin, packages: [ path:{{ .Virtenv }}/flake ], __remove_trigger_package: true, create_files: { {{ .Virtenv }}/flake/flake.nix: haskell/flake.nix } }其工作方式可从源码结构推断插件在虚拟环境目录{{ .Virtenv }}创建flake/flake.nix内容来自模板 plugins/haskell/flake.nix该 Flake 的default输出由ghcWithPackages构造——它会将项目声明的包分类处理stack、cabal-install这类工具被识别为编译链组件形如haskellPackages.*或haskell.packages.版本.*的包则作为额外 Haskell 库注入 GHC 环境其余包被过滤掉模板中通过builtins.match逐项匹配并拼接结果ghc包被识别为编译器的版本锚点用于决定使用哪个 Haskell 包集合插件通过__remove_trigger_package移除触发包保证最终环境干净。因此当你在devbox.json中声明ghc、stack、cabal-install、zlib、hpack、gmp等包后Devbox 会在 Shell 中组合出一个具备完整构建能力的 GHC Stack 工具链无需再手动安装任何系统级依赖。这也是示例 README 中复制 devbox.json →devbox shell→stack new→stack build全流程得以一键跑通的根本原因。进阶指引想为项目增加其他 Haskell 库依赖可在devbox.json的packages中加入haskellPackages.包名插件 Flake 会自动注入或在stack.yaml中通过extra-deps声明锁定具体工具版本时先devbox search pkg查询可用版本再替换latest在 examples/development/haskell/README.md 中可以查看该示例的完整说明示例的devbox.json与devbox.lock则可以作为任何新 Haskell 项目的起点配置。赞分享开发工具CLI【免费下载链接】devboxInstant, easy, and predictable development environments项目地址https://gitcode.com/GitHub_Trending/dev/devbox点击查看免费下载相关推荐Haskell Tool Stack终极指南从零开始的完整开发环境搭建Haskell Tool Stack终极指南从零开始的完整开发环境搭建 Haskell Tool Stack是Haskell开发的终极工具为新手和有经验的开使用 Devbox 在本地启动 Minikube Helm Kubectl一条命令搭建 Kubernetes 开发环境使用 Devbox 在本地启动 Minikube Helm Kubectl一条命令搭建 Kubernetes 开发环境 本指南以仓库中的 Miniku开发工具CLIk-skill 仓库 hwp 技能实战指南基于 kordoc 的 HWP/HWPX 文档解析、JSON 提取、比对与 Markdown 逆转换k skill 仓库 hwp 技能实战指南基于 kordoc 的 HWP/HWPX 文档解析、JSON 提取、比对与 Markdown 逆转换 导读 本文围绕开发工具CLI上一篇Roc 语言 Dict.from_iter 实战指南从键值对迭代器构建字典的完整行为解析下一篇ZeroClaw 多智能体实战指南添加第二智能体、跨智能体文件/记忆访问与对等组配置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/2 3:08:07

网络欺诈检测NLP实战:从TF-IDF到BERT微调的完整指南

简介:网络欺诈检测数据集提供8,564个中英双语欺诈案例,覆盖钓鱼、虚假招聘、冒充等类型,面向自然语言处理与网络安全研究者,用于训练和评估多类别欺诈文本识别模型,可帮助开发者快速构建和迭代检测方案。资源共4个JSON…

2026/10/2 3:08:07

PyTorch CNN遥感滑坡识别:小样本、多光谱与距离场监督

简介:本资源是一套基于PyTorch实现的遥感图像滑坡识别系统,面向地理信息科学、遥感技术及人工智能交叉领域的高校学生与科研初学者,解决地质灾害智能解译中的关键识别问题。压缩包共15个文件,含7个核心Python脚本(涵盖…

2026/10/2 3:08:07

报文修改实战指南:从Wireshark抓包到Linux重放的完整链路

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

2026/10/2 3:08:07

Verilog仿真环境搭建:Icarus+GTKwave+VSCode全链路解析

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

2026/10/2 3:03:07

机票数据分析与可视化大作业:从数据清洗到ECharts交互看板

简介:这是一份面向计算机相关专业学生与项目实战学习者的Python数据分析可视化大作业完整源码,聚焦机票价格数据分析与预测,并借助PyQt5实现可视化界面展示,适合正在准备课程设计、期末大作业或需要练手数据分析项目的人群。资源包…

2026/10/1 5:21:14

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/1 17:09:46

如何划分训练/验证集: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/10/1 10:48:55

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

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

2026/10/2 0:02:57

PWN入门:从栈溢出原理到ROP链实战

1. 这不是“学PWN”,是重新理解你每天敲的每一行C代码我第一次在CTF赛场上写出能控制程序流的exp时,手抖得连gdb的c命令都输错三次。那道题只有23行C代码,一个gets()调用,一个printf(),一个return——它甚至没开NX&…

2026/10/2 0:02:57

Windows下cudaMallocHost显存占用之谜:WDDM与TCC模式差异及优化方案

1. 一个反直觉的显存占用现象第一次在 Windows 上看到cudaMallocHost把显存吃掉的时候,我的反应是打开任务管理器反复确认了三遍。明明调用的是主机端锁页内存分配,按 CUDA 文档的说法,这块内存应该落在系统 RAM 里,跟 GPU 的显存…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑