読者です 読者をやめる 読者になる 読者になる

Cabal sandboxを使ってHaskellのパッケージをいい感じに管理する

Haskell

Cabal sandboxとは

CabalはHaskellのパッケージシステム.Rubyでいうところのgem.ただこのCabalを使ってcabal installコマンドを使うと依存関係のトラブルの元になってしまうとのこと.

そのため開発対象ごとにパッケージデータベースを分離することができる,「Cabal sandbox」でsandbox環境を作成して開発を進めます.Rubyでいうところのbundlerみたいなもの. 以下,その実行手順です.

Cabalを最新の状態にする

最新のパッケージを入れられるようにアップデートを行います

$cabal update

Cabal sandbox環境を使う

作業ディレクトリを作成し,cabal sandbox initコマンドを使います

$mkdir cabal_test
$cd cabal_test
$cabal sandbox init

すると作業ディレクトリ直下にcabal.sandbox.configが生成されます.

.cabalを作成する

sandbox内で使うパッケージなんかを指定するためのファイルを作成します.

cabal init
# 色々聞かれるので,自分の好みで選んでいく

ファイルが作成されたら,中身を編集して必要なパッケージを追加します.builddepends`にコンマ区切りで必要なパッケージを追記していきます.

executable cabal-test
  main-is:             Main.hs
  -- other-modules:       
  -- other-extensions:    
  build-depends:       base >=4.7 && <4.8,
                                 random-shuffle >= 0.0.3
  -- hs-source-dirs:      
  default-language:    Haskell2010

パッケージのインストール

あとはいつも通りcabal installをすると,パッケージはすべて.cabal-sandbox配下に目的のパッケージとその依存パッケージがインストールされます.これでグローバルパッケージデータベースのほうを汚染することは無くなります.

$cabal install

sandbox環境にインストールされているパッケージ一覧を確認するにはcabal sandbox hc-pkg listコマンドを使います.

$cabal sandbox hc-pkg list
<中略>
/Users/UserName/cabal_test/.cabal-sandbox/x86_64-osx-ghc-7.8.3-packages.conf.d
  aeson-0.8.0.2
  attoparsec-0.12.1.2
  dlist-0.7.1
  ...

実行

Main.hsなど実行ファイルを選択した場合には

cabal run

で実行されます.

参考にしたもの

所感

Haskellもくもく会にて僕が

みたいなこと言ってたら,@igrepさんはじめ親切Haskellerの方々が教えてくださった.ありがとうございました〜