
开发工具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),仅供参考