Cabal项目管理 #
一、Cabal简介 #
1.1 什么是Cabal #
Cabal是Haskell的包管理和构建系统:
- 管理包依赖
- 构建和安装包
- 发布到Hackage
1.2 Cabal vs Stack #
| 特性 | Cabal | Stack |
|---|---|---|
| 依赖解析 | 自动 | 预定义 |
| 构建隔离 | 可选 | 默认 |
| 配置文件 | .cabal | package.yaml |
| 学习曲线 | 中等 | 简单 |
1.3 安装Cabal #
bash
# 使用GHCup安装
ghcup install cabal
# 验证安装
cabal --version
二、创建项目 #
2.1 新建项目 #
bash
# 创建项目目录
mkdir my-project
cd my-project
# 初始化项目
cabal init
# 项目结构
my-project/
├── app/
│ └── Main.hs
├── src/
│ └── MyLib.hs
├── test/
│ └── MyLibTest.hs
├── my-project.cabal
└── cabal.project
2.2 cabal文件 #
cabal
-- my-project.cabal
cabal-version: 3.0
name: my-project
version: 0.1.0.0
synopsis: A short description
description: 介绍Haskell Cabal项目管理工具,包括cabal文件配置、依赖管理和构建流程。
license: BSD-3-Clause
author: Author name
maintainer: author@example.com
build-type: Simple
library
exposed-modules: MyLib
build-depends: base >= 4.7 && < 5
hs-source-dirs: src
default-language: Haskell2010
executable my-project
main-is: Main.hs
build-depends: base, my-project
hs-source-dirs: app
default-language: Haskell2010
test-suite my-project-test
type: exitcode-stdio-1.0
main-is: MyLibTest.hs
build-depends: base, my-project
hs-source-dirs: test
default-language: Haskell2010
2.3 cabal.project #
text
-- cabal.project
packages: .
三、构建与运行 #
3.1 更新包索引 #
bash
cabal update
3.2 构建项目 #
bash
# 构建项目
cabal build
# 构建特定组件
cabal build my-project
# 构建所有组件
cabal build all
3.3 运行项目 #
bash
# 运行可执行文件
cabal run my-project
# 运行并传递参数
cabal run my-project -- arg1 arg2
3.4 测试 #
bash
# 运行测试
cabal test
# 运行特定测试
cabal test my-project-test
四、依赖管理 #
4.1 添加依赖 #
cabal
library
build-depends:
base >= 4.7 && < 5,
text,
containers,
aeson
4.2 安装依赖 #
bash
# 构建时自动安装依赖
cabal build
# 手动安装包
cabal install aeson
4.3 冻结依赖 #
bash
# 生成冻结文件
cabal freeze
# cabal.project.freeze
constraints:
aeson ==2.1.2.1,
base ==4.17.2.0,
...
五、开发工作流 #
5.1 REPL #
bash
# 启动REPL
cabal repl
# 加载特定组件
cabal repl lib:my-project
cabal repl exe:my-project
5.2 文档 #
bash
# 生成文档
cabal haddock
# 打开文档
cabal haddock --open
5.3 清理 #
bash
# 清理构建产物
cabal clean
# 删除整个dist目录
rm -rf dist-newstyle
六、包管理 #
6.1 搜索包 #
bash
# 搜索Hackage
cabal search aeson
6.2 查看包信息 #
bash
# 查看包信息
cabal info aeson
6.3 列出已安装包 #
bash
# 列出已安装包
cabal list --installed
七、发布包 #
7.1 准备发布 #
bash
# 检查包
cabal check
# 生成源码包
cabal sdist
7.2 上传到Hackage #
bash
# 上传
cabal upload dist-newstyle/sdist/my-project-0.1.0.0.tar.gz
# 上传文档
cabal upload --documentation dist-newstyle/sdist/my-project-0.1.0.0-docs.tar.gz
八、常用命令 #
8.1 构建命令 #
bash
cabal build # 构建
cabal run # 运行
cabal test # 测试
cabal bench # 基准测试
cabal haddock # 文档
cabal clean # 清理
8.2 包管理命令 #
bash
cabal update # 更新索引
cabal install # 安装包
cabal list # 列出包
cabal info # 包信息
cabal search # 搜索包
8.3 开发命令 #
bash
cabal repl # REPL
cabal configure # 配置
cabal freeze # 冻结依赖
cabal gen-bounds # 生成边界
九、CI配置 #
9.1 GitHub Actions #
yaml
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install GHCup
run: |
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | BOOTSTRAP_HASKELL_NONINTERACTIVE=1 sh
- name: Build
run: cabal build all
- name: Test
run: cabal test all
十、总结 #
Cabal项目管理要点:
- 安装:使用GHCup安装
- 创建项目:
cabal init - 配置:.cabal 文件
- 构建:
cabal build - 运行:
cabal run - 依赖:build-depends 声明
- 发布:
cabal upload
掌握Cabal后,让我们继续学习最佳实践。
最后更新:2026-03-27