Haskell Build und Artefaktumgebung ähnlich wie Maven

20

Ich war lange Zeit Java-Entwickler, bin aber kürzlich einem Haskell-Team beigetreten. Wenn Sie in der Java-Welt ein großes Projekt haben, an dem mehrere Teams arbeiten, besteht ein gängiger Ansatz darin, einen Artefaktserver wie Maven zu verwenden, um die Entwicklung zu vereinfachen und zu beschleunigen. Zahlreiche Build-Tools wie Ant, Maven, Gradle können das Projekt erstellen und eine JAR-Datei auf den Artefaktserver hochladen, die vom Rest des Teams problemlos verwendet werden kann. Durch die Aufteilung des Projekts in kleinere Unterprojekte wird daher auch die Erstellungszeit drastisch reduziert.

Auf der Haskell-Seite verwenden wir cabal, um das Projekt zu erstellen. Unser Projekt dauert ca. 10-15 Minuten, ohne dass eine Optimierung erforderlich ist. Es dauert einige Stunden, bis die Compileroptimierung aktiviert ist, was schmerzhaft ist.

Ich frage mich, wie wir das gleiche tun können wie in Java hier. Gibt es eine einfache Möglichkeit, die Binärdatei der Pakete (Bibliotheken) zu kompilieren und auf einen Artefaktserver hochzuladen und die vorgefertigten Binärdateien zum Zeitpunkt der Erstellung zu verwenden? Ich weiß, dass es Kompatibilitätsprobleme geben kann, da Haskell Maschinencode generiert (und nicht Bytecode in Java), aber wir können wahrscheinlich verschiedene Binärdateien für verschiedene Architekturen / Betriebssysteme auf dem Artefaktserver speichern.

Oxy
quelle
Keine Antwort auf Ihre Frage, aber rufen Sie "cabal build / install" mit der Option -j auf?
Daniel Díaz Carrete
Ja, aber ich sehe nicht viel Beschleunigung. Die CPU-Auslastung beim Erstellen liegt zwischen 15% und 20%. Ich bin nicht sicher , wo das Problem ist: cabal, GHC, Test.Frameworkoder der Linker.
Oxy
Laut dieser SO-Antwort ist der Hauptgrund die native Natur der ausführbaren Dateien von Haskell.
Daniel Díaz Carrete
Ich spreche hauptsächlich von Entwicklung. Es ist richtig, dass Binärdateien aufgrund unterschiedlicher Betriebssysteme, CPU-Architekturen und sogar Compilerversionen zu Inkompatibilitäten führen können. Aber warum sollte ich so viel Zeit verschwenden, wenn ich jeden Tag auf demselben Computer, demselben Betriebssystem und demselben Compiler entwickle?
Oxy
Es sieht so aus, als ob Halcyon mit einem Cache nützlich sein könnte: halcyon.sh/reference/#private-storage-options
Lubomír Sedlář

Antworten:

2

Sie könnten erwägen, Nix zu verwenden , einen plattformübergreifenden Allzweck-Paketmanager mit angemessener Unterstützung für Haskell.

Nix hat eine eigene Programmiersprache zum Definieren von Paketen (die rein, funktional und faul ist). Das Definieren neuer und das Erweitern bestehender Pakete ist ziemlich einfach (z. B. um Abhängigkeiten zu ändern, die Quelle aus einem anderen Git-Repo zu beziehen usw.).

Pakete werden durch Hashes identifiziert, die Abhängigkeiten enthalten. Daher können mehrere Versionen oder dieselbe Version mit unterschiedlichen Abhängigkeiten ohne Konflikte nebeneinander leben. Nix kann den gewünschten Hash auf einem "Binär-Cache" -Server nachschlagen, um festzustellen, ob das bestimmte Paket mit diesen bestimmten Abhängigkeiten bereits erstellt wurde. In diesem Fall wird das Build-Produkt heruntergeladen und nicht kompiliert.

Derzeit enthält das nixpkgs-Repository den größten Teil von Hackage, mehrere GHC-Versionen (7.10.1, 7.8.4 und einige JS-Backends) und ein cabal2nixDienstprogramm, mit dem sich Nix-Pakete aus .cabal-Dateien recht gut generieren lassen. Es gibt auch den Nix-basierten "Hydra" -CI-Server, mit dem Sie Builds basierend auf SCM-Commits auslösen können.

Warbo
quelle