Stackageにないパッケージをstackで使うまでの道のり

  • Haskellではコンパイラや(?)各種パッケージのバージョンの整合性問題で悩むことが多いので、Stackという仕組みをつかって、プロジェクトごとに、実行・作業環境を揃えるのがよいらしい
  • yamlファイルというのを使う
  • このStackだが、Stackで使いやすいようにメンテナンスされたStackageというパッケージ管理サイトのパッケージを使うには、stack.yamlというファイルに書き込んでやれば色々と便利に作られている(らしい)のだが、たまたま、Stackageにはなく、Hackageにあるパッケージを使いたかった
  • 色々と大変だった
  • その顛末をメモしておく
  • まずは、ハスケルをインストールして、stackコマンドも使えるようにしておく
  • 新規のハスケル作業環境を作る
$ stack new hogeproject
$ cd hogeproject
$ stack init
  • こうすることで、hogeproject ディレクトリに一通りのファイル・ディレクトリができる
  • 特にパッケージを加えるつもりがなく、自分でどんどんコードを書いていくなら、この環境に自分の世界を作ればよい
  • そのためには
$ stack build
$ stack ghci
  • として、この世界をビルドして、そのビルドした世界でのghciを立ち上げるなどすればよい
  • パッケージを入れたいとする
  • 今回はHaskellForMathsというパッケージで、Stackageにはなく、Hackageにあるそれを入れることにしたい
  • hogeprojectディレクトリにて
stack install HaskellForMaths
  • とHackageからローカルにインストールする
  • これだけでは使えない
  • stack.yamlファイルの
# extra-deps: []
  • と言う箇所を書き換えて
extra-deps:
- HaskellForMaths-0.4.9
  • と、ちゃんとバージョンも正しく(インストールの時に示されているはずなので)書き込む
  • これで、ローカルにインストールしてあるHaskellForMaths-0.4.9を取り込んでビルドする準備は出来上がっている
$ stack build
$ stack ghci
  • とすると、ちゃんとghciが立ち上がる
  • で、
*Main Lib> import Math.Combinatorics.Graph
  • と、HaskellForMathsの中身を使うべく、importすると、エラーがでる
<no location info>: error
Could not load module 'Math.CombinatoricsGraph'
It is a member of the hidden package 'HaskellForMath-0.4.9'.
You can run ':set -package HaskellForMaths' to expose it.
(Note: this unloads all the modules in the current scope.)
  • 隠れているし、それをghciの中でみえるようにすることもできるけれど、他のモジュールと一緒に使えなくなる。。。
  • それは困る、と言うので、調べ物をすると、こちらにあるように、hogeproject.cabalファイルをいじる必要があると言う
build-depends:
   base >=4.7 && <5
default-language: Haskell2010
  • と書かれている部分を

build-depends:
base >=4.7 && <5
, HaskellForMaths
default-language: Haskell2010
|