You don't have javascript enabled. Good luck! :(

cabal コマンドとの対応表

最終更新日: 2019/01/21

stack と cabal

$ stack --numeric-version
1.9.3

$ cabal --numeric-version
2.4.1.0
  stack cabal
ドキュメント stack user guide Cabal User Guide
repo commercialhaskell/stack haskell/cabal
コマンド名 stack cabal (正式には cabal-install と呼ばれているもの)

stack と cabal の違い

  • extra-lib-dirsextra-include-dirs などで依存するライブラリが変化した時
    • stack: ~/.stack/snapshots/ 以下を手動で削除し、リビルドする必要がある
    • cabal: nix-style を採用しているため、リビルドするだけで良い
  • パッケージをリビルドするタイミング
    • stack: resolver が変化した際に、パッケージを新たに全てリビルドする必要がある
    • cabal: compiler が変化した際に、パッケージを新たに全てリビルドする必要がある

コマンド対応表

stack cabal 備考
stack init cabal init -n --is-executable
cabal init --simple
cabal init --lib
cabal init --exe
cabal init --libandexe
#5707, #5759
stack setup _ ghcup を利用する
stack build cabal new-build
stack test cabal new-test --enable-tests
cabal new-test all
#5079
stack repl cabal new-repl
stack clean cabal new-clean
stack run cabal new-run
stack --version cabal --version
stack --numeric-version cabal --numeric-version
stack upgrade cabal new-install cabal-install
cabal new-install cabal-install --overwrite-policy=always
? cabal new-haddock
? cabal new-sdist
? cabal check
? cabal upload
cabal upload --publish
stack update cabal new-update

どちらか一方にしかないコマンドやオプション

stack cabal 備考
stack build --file-watch #5252

設定ファイル等のパス対応表 (初期値)

stack cabal
~/.stack/ ~/.cabal/
~/.stack/config.yaml, ~/.stack/global-project/stack.yaml ~/.cabal/config

Tips

コマンドの自動補完

stack

$ echo 'eval "$(stack --bash-completion-script stack)"' >> ~/.bashrc

cabal

$ curl https://raw.githubusercontent.com/haskell/cabal/master/cabal-install/bash-completion/cabal -O
$ sudo mv cabal /usr/share/bash-completion/completions/

マルチパッケージプロジェクト

stack

# stack.yaml
packages:
- .
- ./package1
- ./package2
- ./package3

実行方法

# 全てのパッケージ
$ stack build
$ stack repl

# 個別のパッケージ
$ stack build package1
$ stack repl package1

cabal

-- cabal.project
packages:
  ./
  package1
  package2
  package3

実行方法

# 全てのパッケージ
$ cabal new-build all
$ cabal new-repl

# 個別のパッケージ
$ cabal new-build package1
$ cabal new-repl basic

リモートリポジトリ

stack

複数パッケージになっている場合は subdirs を指定する

cabal

# cabal.project
source-repository-package
  type: git
  location: https://github.com/fumieval/extensible
  tag: 81ccac73f7480ea66e6008e660972bfee9e83976

複数パッケージになっている場合は subdir を指定する

# cabal.project
source-repository-package
  type: git
  location: https://github.com/gtk2hs/gtk2hs
  tag: 7bccd432e2f962d80b2b804fa2a59712e402753c
  subdir: cairo

プロファイリング

stack

$ stack build --profile

cabal

profiling: True

cabal.project.local に上記の内容を追加し、cabal new-build すれば良い。

プロジェクトで利用する ghc を強制する方法

cabal

cabal.projectwith-compiler を追記する

with-compiler: ghc-8.6.2

build-depends で利用するバージョン制約の指定方法

利用可能な演算子 記号
比較演算子 ==, >=, >, <, <=, ^>=
条件演算子 &&, \|\|

良くある指定方法

pkgname >= n
pkgname ^>= n
pkgname >= n && < m
pkgname == n.*

省略形

省略形 展開後
foo == 4.* foo >= 4 && < 5
foo == 1.2.* foo >= 1.2 && < 1.3
foo ^>= x foo >= x && < x.1
foo ^>= x.y foo >= x.y && < x.(y+1)
foo ^>= x.y.z foo >= x.y.z && < x.(y+1)
foo ^>= x.y.z.u foo >= x.y.z.u && < x.(y+1)

備考

  • ワイルドカードは Cabal 1.6 から利用可能
  • ^>=Cabal 2.0 から利用可能 (キャレット)
  • foo == 1.0.*foo-1 にはマッチしないので注意 (^>= の利用を推奨)

cabal.project.local の設定

$ cabal new-configure -j

スクリプト形式

stack

実行方法

$ stack script --resolver lts-13.1 Script.hs

cabal

実行方法

$ cabal new-run Script.hs
$ cabal new-run Script.hs -- --arg1 # 引数有り

参考