Haskell技术问询:如何从源码目录自动生成可直接运行的.stack/.cabal文件?
自动生成Haskell构建配置的可行方案
嘿,这个需求太贴合实际了——谁不想跳过手动写.cabal/stack配置的繁琐步骤呢?直接给你结论:完全可以自动生成这些配置文件,让工具帮你自动识别源码里的依赖,而且生成后不用先跑stack new这类初始化命令就能直接运行。下面给你拆解具体的工具和用法:
1. 用stack init快速搞定stack生态的配置
如果你更习惯用stack,stack init就是为现有源码项目量身定做的工具。它会递归扫描你的源码目录(包括子目录),分析所有import语句,自动找出需要的Hackage包依赖,然后生成stack.yaml和对应的.cabal文件(如果之前没有的话)。
- 用法超简单,进到源码根目录直接跑:
stack init --resolver lts-20.25 # 可以指定一个稳定的resolver版本,也可以让stack自动选合适的 - 生成完配置后,直接敲
stack run就能启动你的程序,完全不需要先执行stack new——stack init是给已有项目补配置,不是创建新项目。
2. 用cabal init+辅助工具生成.cabal文件
Cabal也支持自动生成配置,用非交互模式就能跳过那些繁琐的问答环节,再搭配一些小工具还能精准补全依赖:
- 先跑非交互的
cabal init生成基础配置:cabal init --non-interactive --package-name my-haskell-project --author "Your Name" --license BSD-3-Clause --executable - 默认的依赖检测可能不够智能,要是跑
cabal build因为缺依赖失败,别慌,用cabal-plan来自动补全:
这个命令会自动把缺失的依赖添加到你的.cabal文件里,省得你一个个查包名。cabal build --dry-run | cabal-plan add-deps
3. 进阶玩法:用hpack+依赖扫描工具简化配置
如果你觉得.cabal文件的格式太啰嗦,可以用hpack——它允许你用更简洁的YAML格式(package.yaml)管理配置,再自动生成标准的.cabal文件。搭配imports-to-deps工具,还能自动扫描源码里的imports生成依赖列表:
- 先安装工具:
stack install imports-to-deps - 扫描你的源码目录,生成依赖文件:
imports-to-deps src/ > dependencies.yaml - 然后在
package.yaml里引用这个依赖文件:# package.yaml name: my-haskell-project executable: main: Main.hs source-dirs: src/ dependencies: !include dependencies.yaml - 最后跑
hpack生成.cabal文件,再用stack run或者cabal run直接执行程序就行。
几个要注意的小细节
- GHC自带的核心包(比如
base、containers)工具会自动识别,不用你手动添加。 - 要是你用了一些非常冷门的包,或者本地开发的私有包,工具可能没法自动检测,这时候就得手动补一下依赖了。
- 生成的配置文件可能需要微调(比如指定可执行文件的入口、优化选项),但核心的依赖和项目结构都已经帮你搞定了,不用从头写起。
内容的提问来源于stack exchange,提问作者Atir
相关产品推荐
相关产品推荐

