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项目管理要点:
- 安装:使用GHCup或官方脚本
- 创建项目:
stack new project-name - 配置:package.yaml 和 stack.yaml
- 构建:
stack build - 运行:
stack run - 依赖:在package.yaml中声明
- CI/CD:使用GitHub Actions等
掌握Stack后,让我们继续学习Cabal项目管理。
最后更新:2026-03-27