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项目管理要点:

  1. 安装:使用GHCup安装
  2. 创建项目cabal init
  3. 配置:.cabal 文件
  4. 构建cabal build
  5. 运行cabal run
  6. 依赖:build-depends 声明
  7. 发布cabal upload

掌握Cabal后,让我们继续学习最佳实践。

最后更新:2026-03-27