Stack项目管理 #

一、Stack简介 #

1.1 什么是Stack #

Stack是Haskell的跨平台构建工具:

  • 管理项目依赖
  • 隔离构建环境
  • 可重现的构建
  • 支持多GHC版本

1.2 安装Stack #

bash
# Linux/macOS
curl -sSL https://get.haskellstack.org/ | sh

# 或使用GHCup
ghcup install stack

1.3 验证安装 #

bash
stack --version

二、创建项目 #

2.1 新建项目 #

bash
# 创建新项目
stack new my-project

# 使用模板
stack new my-project simple
stack new my-project rio

# 项目结构
my-project/
├── app/
│   └── Main.hs
├── src/
│   └── Lib.hs
├── test/
│   └── Spec.hs
├── my-project.cabal
├── stack.yaml
└── package.yaml

2.2 初始化现有项目 #

bash
cd existing-project
stack init

2.3 项目配置 #

yaml
# package.yaml
name: my-project
version: 0.1.0.0
license: BSD-3-Clause
author: Author name
maintainer: author@example.com

dependencies:
  - base >= 4.7 && < 5

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

三、构建与运行 #

3.1 构建项目 #

bash
# 构建项目
stack build

# 构建并运行测试
stack build --test

# 构建并生成文档
stack build --haddock

3.2 运行项目 #

bash
# 运行可执行文件
stack run

# 或指定可执行文件
stack exec my-project-exe

# 运行并传递参数
stack run -- arg1 arg2

3.3 测试 #

bash
# 运行测试
stack test

# 运行特定测试
stack test --test-arguments="--match \"specific test\""

四、依赖管理 #

4.1 添加依赖 #

yaml
# package.yaml
dependencies:
  - base >= 4.7 && < 5
  - text
  - containers
  - aeson

4.2 stack.yaml #

yaml
# stack.yaml
resolver: lts-21.25

packages:
- .

extra-deps:
  - some-package-1.0.0

ghc-options:
  "$locals": -Wall

4.3 更新依赖 #

bash
# 更新包索引
stack update

# 升级resolver
stack upgrade

五、GHC管理 #

5.1 查看可用GHC #

bash
stack ls snapshots

5.2 切换GHC版本 #

yaml
# stack.yaml
resolver: ghc-9.4.8
# 或
resolver: lts-21.25

5.3 安装GHC #

bash
# Stack自动安装所需GHC
stack build

六、常用命令 #

6.1 开发命令 #

bash
# 交互式GHCi
stack ghci

# 运行脚本
stack script myscript.hs

# 清理构建
stack clean

# 删除所有构建产物
stack purge

6.2 信息命令 #

bash
# 查看依赖树
stack dot | dot -Tpng -o deps.png

# 查看已安装包
stack ls dependencies

# 查看路径
stack path

6.3 Docker支持 #

bash
# 使用Docker构建
stack build --docker

# Docker配置
# stack.yaml
docker:
  enable: true
  image: fpco/stack-build:lts-21.25

七、最佳实践 #

7.1 项目结构 #

text
my-project/
├── app/           # 可执行文件
├── src/           # 库代码
├── test/          # 测试
├── benchmark/     # 性能测试
├── README.md
├── ChangeLog.md
├── LICENSE
├── package.yaml
└── stack.yaml

7.2 版本控制 #

gitignore
# .gitignore
.stack-work/
*.cabal
*~

7.3 CI配置 #

yaml
# .github/workflows/ci.yml
name: CI

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Install Stack
      run: |
        mkdir -p ~/.local/bin
        curl -L https://get.haskellstack.org/stable/linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'
    
    - name: Build
      run: stack build --test --bench --no-run-benchmarks

八、总结 #

Stack项目管理要点:

  1. 安装:使用GHCup或官方脚本
  2. 创建项目stack new project-name
  3. 配置:package.yaml 和 stack.yaml
  4. 构建stack build
  5. 运行stack run
  6. 依赖:在package.yaml中声明
  7. CI/CD:使用GitHub Actions等

掌握Stack后,让我们继续学习Cabal项目管理。

最后更新:2026-03-27