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
|