14

CircleCI を使用していくつかの Haskell プロジェクトを構築しようとしています。Circle は/home/ubuntu/.cabal各ビルドの後にディレクトリを自動的にキャッシュします。これによりビルドが高速化されると思いましたが、以前と同じくらい時間がかかるようです。省略されているのはダウンロード手順だけです。

私が使用しているビルド手順は

cabal update
cabal install --only-dependencies --enable-tests
cabal configure --enable-tests
cabal build
cabal test

install --only-dependenciesそして、ステップがキャッシュを見て、より速く実行されると予想しました.

何がうまくいかないのですか?

4

1 に答える 1

4

数か月前に、 Redditで陰謀団の問題に関する優れた議論がありました。私の記憶では、Haskell には指定されたアプリケーション バイナリ インターフェイスがなく、ghcコンパイラはコンパイル中に多くの積極的なライブラリ間グラフ削減を行っています。その結果、Haskell アプリに安定したライブラリをインストールすることはできません。どのライブラリもドラッグ ダウンされ、インストール済みのライブラリの完全なセットに対して再コンパイルされる可能性があります。

ここでの結論は、.cabal/libディレクトリをキャッシュしても、インストールを高速化することには何の役にも立たないということです。依存関係の再コンパイルは常に行われます。を使用したサンドボックス化以外の最善の方法は、hsenvを呼び出すときに依存ライブラリの完全なセットを指定することですcabal install。そうすれば、依存関係を事前に計算でき、コンパイルは 1 回だけ実行されます。

Haskell の達人、私がここで言ったことに間違いがあれば、遠慮なく訂正してください。私は Haskell ループから数か月離れていましたが、最近、cabal/library の問題が多くの注目を集めていることを認識しています。

于 2013-02-05T16:35:12.223 に答える