IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

cabalでローカルにあるライブラリを使う

課題

  • ローカルに自作ライブラリのソースコードがある。
    • ライブラリ側の変更はない仮定(安定している仮定)。
  • そのライブラリを使うプログラムをローカルで作りたい。
  • ライブラリのソースコードディレクトリは別にするが、cabalプロジェクトを作る。
    • ライブラリ側はlibraryディレクトリ配下、プログラムはsrc配下のようにする。
  • ライブラリ側のコードも一緒にコンパイルされるので、ビルドに時間がかかる。 ⇨ なんとかしたい

解決策

  • ライブラリ単独でcabalプロジェクトにして、それをプログラム側のcabalプロジェクトにインストールする。

やり方

  • ライブラリ用のcabalプロジェクトを作成する。
> cabal sandbox init
などなど
name:                mylibrary
version:             0.1.0.0
省略

library
  exposed-modules: Foo.Bar.X
                 , Foo.Bar.Y
                 , Foo.Bar.Z
                 , などなど
 
  • ライブラリモジュールを作成する(ビルドする)。
> cabal build
  • 上記のライブラリを利用するcabalプロジェクトを作成する。まずは、ライブラリを意識せずにプロジェクトを作成する。
> cabal sandbox init
いろいろ
  • ライブラリプロジェクトを取り込む。
> cabal sandbox add-source ライブラリがあるパス(のcabalファイルの親ディレクトリのパス)
  • cabalファイルの依存関係の指定をする。
executable myprogram
  main-is:             Main.hs
  other-extensions:    BangPatterns, DeriveDataTypeable, DeriveGeneric, FlexibleInstances, MultiParamTypeClasses
  build-depends:       base >=4.9 && <4.10
   その他いろいろ
                     , mylibrary <-- ここにライブラリ名を追加
  • インストール
> cabal install
  • 再度やり直したいときは、取り込んだライブラリプロジェクトをいったん削除する。その後、もう一度インストールをする。
> cabal sandbox delete-source ライブラリがあるパス(のcabalファイルの親ディレクトリのパス)

作業ログ

haskell

Data.Binary.Get

読み込みの場合、基本的にバイナリデータピッタリでないと実行時エラーとなる。runGetしてデータがない場合や不足した場合、Nothingや読み込め多分が返却されるような仕組みではない。(と思う)。終わりがわからない場合runGetOrFailで都度確認が必要になる。