如何使用Stack处理单文件Haskell代码?配置常用依赖方法问询
当然有办法解决这个单文件Haskell开发的依赖痛点!我之前也被每次新建项目改配置的繁琐操作折腾过,下面几个实用方案你可以按需选择:
方案1:利用Stack的全局项目配置(最推荐)
Stack本身支持全局项目的概念,你可以把常用依赖统一配置在全局项目里,这样所有单文件都能共享这些依赖环境:
- 找到Stack的全局项目目录,一般是
~/.stack/global-project/(Windows用户是%APPDATA%\stack\global-project\) - 编辑(或新建)该目录下的
package.yaml,在dependencies字段里添加你常用的包,示例如下:
name: global-project version: 0.1.0.0 dependencies: - base >= 4.14 && < 5 # 下面是你常用的依赖,按需添加 - text - aeson - containers - lens - mtl executables: global-project-exe: main: Main.hs source-dirs: app ghc-options: - -threaded - -rtsopts - -with-rtsopts=-N
- 进入全局项目目录,运行
stack build让Stack下载并编译这些依赖(只需要做一次) - 之后你再运行
stack exec -- ghci my-file.hs时,Stack会自动加载全局项目的依赖,你在单文件里导入Data.Text、Data.Aeson这类模块就不会报错了
小贴士:如果你的全局项目resolver和平时用的不一致,可能会出现版本冲突,记得编辑
~/.stack/global-project/stack.yaml,把resolver字段设置成你常用的快照版本(比如lts-20.25)
方案2:临时指定依赖(适合偶尔使用的包)
如果只是临时需要某个不常用的包,不想修改全局配置,可以直接在stack exec命令里用--package参数指定:
stack exec --package text --package aeson -- ghci my-file.hs
不过这个方法每次都要手动写依赖包名,适合单次测试的场景。
方案3:自定义模板项目(多场景依赖管理)
如果你需要针对不同场景维护多套依赖集,可以创建一个本地的模板项目:
- 在某个目录新建一个Stack项目:
stack new hs-template simple - 编辑模板项目的
package.yaml,添加对应场景的常用依赖,然后运行stack build - 之后运行单文件时,指定模板项目的配置文件:
stack --stack-path ./hs-template/stack.yaml exec -- ghci my-file.hs
这个方法适合你有多个不同依赖组合的开发场景,比如一套用于web开发,一套用于数据分析。
内容的提问来源于stack exchange,提问作者luochen1990
相关产品推荐
相关产品推荐

