新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/10/2 2:23:03来源:尧图网络
使用 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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

用pandas+LightGBM实战葡萄酒评论数据集:从CSV清洗到评分预测 2026/10/2 4:07:45

用pandas+LightGBM实战葡萄酒评论数据集:从CSV清洗到评分预测

简介:一份面向数据挖掘、文本分析与统计学习者的葡萄酒评论数据集,约130k条真实评论记录,覆盖品种、产地位置、酒庄、价格及评酒师描述等核心字段,适合用于情感分析、价格回归、品类聚类等练习或课题研究。资源共3个文件&#xff…

阅读更多 →
基于YOLOv5与DeepSORT的校园安全监控异常行为识别系统解析 2026/10/2 4:07:31

基于YOLOv5与DeepSORT的校园安全监控异常行为识别系统解析

简介:一份面向校园安全场景的智能监控系统项目资料包,源自华南理工大学大学生创新创业训练计划,适合学习YOLOv5与OpenCV实战应用的计算机视觉初学者,也适合有毕业设计或竞赛需求的学生参考。项目围绕摄像头视频流中的异常行为检测…

阅读更多 →
PPO期货量化交易实战:源码解析、环境搭建与参数调优 2026/10/2 4:07:31

PPO期货量化交易实战:源码解析、环境搭建与参数调优

简介:一个基于深度强化学习PPO算法的期货量化交易项目,覆盖交易环境构建、模型设计、训练与测试完整流程,定位清晰:主要面向计算机、数据科学、人工智能、金融科技等专业学生,以及希望在量化方向快速入门的高年级开发者…

阅读更多 →
Python自动化报表生成:从手工复制粘贴到一键搞定 2026/10/2 4:07:31

Python自动化报表生成:从手工复制粘贴到一键搞定

先说个背景吧。我接到的任务本身不复杂,但特别磨人:每天上班第一件事,登进内部系统,按业务线逐张导报表,导完以后打开Excel手工复制粘贴,把七八个sheet合并成一张总表,再做去重、补空值、统一时…

阅读更多 →
科研智能体平台落地全指南:选型、配置与实战案例拆解 2026/10/2 4:07:31

科研智能体平台落地全指南:选型、配置与实战案例拆解

科研智能体平台这两年算是真正从概念走向落地了。我周围不少课题组一开始只是拿大模型当聊天工具用,后来陆续转向搭建自己的智能体平台,把文献调研、代码调试、数据清洗、审稿模拟这些重复性工作交给Agent去跑,人只负责定方向、审结果。今天这…

阅读更多 →
自动标注三件套:Grounded-SAM、autodistill、X-AnyLabeling 实战 2026/10/2 4:07:31

自动标注三件套:Grounded-SAM、autodistill、X-AnyLabeling 实战

标注工作最磨人的不是画框这个动作本身,而是“重复、量大、还得保证质量”。我去年把整套标注流程彻底重写了一遍,从原来靠人在 X-AnyLabeling 里一张张手工拉框,到后来引入 Grounded-SAM 自动出掩膜、再用 autodistill 做主动学习迭代&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉