You don't have javascript enabled. Good luck! :(
記事公開日: 2018/11/30
最終更新日: 2020/04/12

cabal コマンドとの対応表

注意点

このページの内容は cabal HEAD を追っているため、最新版の cabal ではまだ利用不可能な内容も含まれる場合があります。

参考となるサイト&記事

stack と cabal

$ stack --version
Version 2.1.3, Git revision 636e3a759d51127df2b62f90772def126cdf6d1f (7735 commits) x86_64 hpack-0.31.2

$ cabal -V
cabal-install version 3.2.0.0
compiled using version 3.2.0.0 of the Cabal library
  stack cabal
ドキュメント stack user guide Cabal User Guide (latest)
repo commercialhaskell/stack haskell/cabal
コマンド名 stack cabal (正式には cabal-install と呼ばれているもの)

stack と cabal の違い

v1-build と v2-build コマンドの違い

  • cabal v2-buildNix-style Local Builds
  • cabal buildcabal v1-build のエイリアス
  • cabal new-buildcabal v2-build のエイリアス
  • cabal v3.0.0.0 からは cabal v2-buildcabal build のエイリアス (#5800)
cabal version cabal build cabal new-build
v3.2.0.0 v2-build v2-build
v3.0.0.0 v2-build v2-build
v2.4.1.0 v1-build v2-build

コマンド対応表

stack cabal 備考
stack install cabal install cabal install コマンドについて
stack init cabal init -n --is-executable
cabal init --simple
cabal init --lib
cabal init --exe
cabal init --libandexe
#5707, #5759, #5864, #6676
stack build cabal build
stack test cabal test
stack repl
stack ghci
cabal repl cabal repl コマンドについて
stack clean cabal clean
stack run cabal run
stack --version cabal --version
cabal -V
stack --numeric-version cabal --numeric-version
stack upgrade cabal install cabal-install ghcup を利用する
? cabal haddock
? cabal sdist
? cabal check
? cabal upload
cabal upload --publish
stack update cabal update
? cabal list #6681

オプション対応表

stack cabal 備考
local-bin-path installdir

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

stack cabal 備考
stack build --file-watch #5252
- cabal format #2460, #5306, #5734
cabal-fmt の紹介
stack path #3850, #4661
stack setup ghcup を利用する
#3420 cabal build --enable-executable-static #5446
- -w オプション。
cabal repl --with-compiler ghc-8.8.3
cabal repl -w ghc-8.8.3
コンパイラを指定できる

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

stack cabal
~/.stack/ ~/.cabal/
~/.local/bin ~/.cabal/bin
? ~/.cabal/store
~/.stack/config.yaml
~/.stack/global-project/stack.yaml
~/.cabal/config

Tips

index-state

  • Cabal-2.0 から利用可能
  • デフォルト値は HEAD

cabal.project に追加する場合は以下のようにすれば良い。

index-state: 2020-03-28T06:23:15Z

その他にも指定方法としては HEADUNIX timestamp format が利用できる。

index-state: HEAD

-- UNIX timestamp format example
index-state: @1474739268

-- ISO8601 UTC timestamp format example
index-state: 2016-09-24T17:47:48Z

現在の UNIX timestamp formatISO8601 UTC timestamp format は以下のコマンドで取得できる。

$ date +%s
1586488404

$ date -u +"%Y-%m-%dT%H:%M:%SZ"
2020-04-10T03:18:55Z

cabal configure で指定する場合は以下のようにすれば良い。

$ cabal configure --index-state=HEAD
$ cabal configure --index-state=$(date +%s)
$ cabal configure --index-state=$(date -u +"%Y-%m-%dT%H:%M:%SZ")

Stackage のスナップショットから project.cabal.freeze ファイルを生成する方法

スナップショットの URLcabal.config を追加すると cabal.project.freeze ファイルが取得できる。

# lts-15 の最新版の例
$ curl https://www.stackage.org/lts-15/cabal.config > cabal.project.freeze

# lts-15.5 の例
$ curl https://www.stackage.org/lts-15.5/cabal.config > cabal.project.freeze

# nightly-2020-03-24 の例
$ https://www.stackage.org/nightly-2020-03-24/cabal.config > cabal.project.freeze

コマンドの自動補完

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 build all
$ cabal repl

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

リモートリポジトリ

stack

# stack.yaml
extra-deps:
- github: fumieval/extensible
  commit: 81ccac73f7480ea66e6008e660972bfee9e83976

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

# stack.yaml
extra-deps:
- github: gtk2hs/gtk2hs
  commit: 7bccd432e2f962d80b2b804fa2a59712e402753c
  subdirs:
  - cairo

複数のパッケージを指定する場合は subdirs に追加するだけで良い。

# stack.yaml
extra-deps:
- github: gtk2hs/gtk2hs
  commit: 7bccd432e2f962d80b2b804fa2a59712e402753c
  subdirs:
  - cairo
  - gtk

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

複数のパッケージを指定する場合、cabal-3.2.0.0 からは以下のように subdir に複数のパッケージを並べて書けるようになった。

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

cabal-3.0.0.0以前はstacksubdirs のような書き方はできないため、source-repository-package を複数記述しなければならない。(#5472)

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

プロファイリング

stack

$ stack build --profile

cabal

profiling: True

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

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

cabal

cabal.projectwith-compiler を追記する

with-compiler: ghc-8.8.3

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 にはマッチしないので注意 (^>= の利用を推奨)

集合記法

tested-with: GHC == 8.6.3, GHC == 8.4.4, GHC == 8.2.2, GHC == 8.0.2,
             GHC == 7.10.3, GHC == 7.8.4, GHC == 7.6.3, GHC == 7.4.2

build-depends: network ^>= 2.6.3.6 || ^>= 2.7.0.2 || ^>= 2.8.0.0 || ^>= 3.0.1.0

こんな感じで書き直せる

tested-with: GHC == { 8.6.3, 8.4.4, 8.2.2, 8.0.2, 7.10.3, 7.8.4, 7.6.3, 7.4.2 }

build-depends: network ^>= { 2.6.3.6, 2.7.0.2, 2.8.0.0, 3.0.1.0 }

cabal.project.local の設定

$ cabal configure -j

スクリプト形式

stack

#!/usr/bin/env stack

{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE QuasiQuotes           #-}
{-# LANGUAGE TemplateHaskell       #-}
{-# LANGUAGE TypeFamilies          #-}
import           Yesod

data HelloWorld = HelloWorld

mkYesod "HelloWorld" [parseRoutes|
/ HomeR GET
|]

instance Yesod HelloWorld

getHomeR :: Handler Html
getHomeR = defaultLayout [whamlet|Hello World!|]

main :: IO ()
main = warp 3000 HelloWorld

実行方法

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

cabal

#!/usr/bin/env cabal
{- cabal:
build-depends: base   ^>= 4.12
             , yesod  ^>= 1.6.0
-}

{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE QuasiQuotes           #-}
{-# LANGUAGE TemplateHaskell       #-}
{-# LANGUAGE TypeFamilies          #-}
import           Yesod

data HelloWorld = HelloWorld

mkYesod "HelloWorld" [parseRoutes|
/ HomeR GET
|]

instance Yesod HelloWorld

getHomeR :: Handler Html
getHomeR = defaultLayout [whamlet|Hello World!|]

main :: IO ()
main = warp 3000 HelloWorld

実行方法

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

便利ツール