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.
cabal
,GHC
,Test.Framework
oder der Linker.Antworten:
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
cabal2nix
Dienstprogramm, 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.quelle