2013-02-05 3 views
14

Ich versuche CircleCI zu verwenden, um einige Haskell-Projekte zu erstellen. Circle speichert automatisch das /home/ubuntu/.cabal Verzeichnis nach jedem Build und ich dachte, das würde die Builds beschleunigen, aber sie scheinen genauso lange zu dauern wie vorher - alles was übersprungen wird, ist der Download-Schritt.Warum installiert cabal Pakete neu in .cabal/lib installieren?

Die Build-Anweisungen Ich verwende sind

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

und ich davon aus, dass install --only-dependencies Schritt den Cache sehen würde und schneller laufen.

Was könnte schief gehen?

Antwort

4

Es gab eine excellent Reddit discussion von Kabalen Ausgaben ein paar Monate zurück. Meine Erinnerung ist, dass Haskell kein spezifisches binäres Anwendungsinterface hat, und dass der ghc Compiler während der Kompilierung viele aggressive Inter-Bibliotheks-Graphreduktionen durchführt. Daher gibt es keine stabile Bibliotheksinstallation in einer Haskell-App - jede Bibliothek wird wahrscheinlich mit der gesamten Gruppe bereits installierter Bibliotheken heruntergezogen und neu kompiliert.

Die Quintessenz hier ist, dass die Zwischenspeicherung der .cabal/lib Verzeichnis nichts zur Beschleunigung der Installation. Die Neukompilierung von Abhängigkeiten wird immer passieren. Ihr bester Ansatz neben dem Sandboxing mit hsenv besteht darin, beim Aufruf von cabal install Ihren vollständigen Satz abhängiger Bibliotheken anzugeben. Auf diese Weise können die Abhängigkeiten im Voraus berechnet werden und die Kompilierung sollte nur einmal erfolgen.

Haskell Gurus, bitte fühlen Sie sich frei, mich zu korrigieren, wenn irgendetwas, was ich hier sagte, falsch ist. Ich war einige Monate außerhalb der Haskell-Schleife und mir ist bewusst, dass Probleme mit Kabalen/Bibliotheken in letzter Zeit viel Aufmerksamkeit erhalten haben.