J'étais développeur Java depuis longtemps, mais récemment, j'ai rejoint une équipe Haskell. Dans le monde java, si vous avez un grand projet, avec plusieurs équipes qui y travaillent, une approche courante consiste à utiliser un serveur d'artefacts tel que Maven pour faciliter et accélérer le développement. De nombreux outils de génération, tels que Ant, Maven, Gradle, peuvent générer le projet et télécharger un fichier jar sur le serveur d'artefacts qui peut être utilisé par le reste de l'équipe sans douleur. Par conséquent, en divisant le projet en sous-projets plus petits, le temps de construction est également considérablement réduit.
Du côté de Haskell, nous utilisons cabal
pour construire le projet. Notre projet prend environ 10-15 minutes à construire sans optimisation. Cela prend quelques heures si l'optimisation du compilateur est activée, ce qui est pénible.
Je me demande comment nous pouvons faire la même chose que nous faisons ici en Java. Existe-t-il un moyen facile de compiler et de télécharger le binaire des packages (bibliothèques) sur un serveur d'artefacts et d'utiliser les binaires précompilés au moment de la construction? Je sais que puisque Haskell génère du code machine (plutôt que du code octet en Java), il peut y avoir des problèmes de compatibilité, mais nous pouvons probablement avoir différents binaires pour différentes architectures / OS stockés sur le serveur d'artefacts.
cabal
,GHC
,Test.Framework
ou l'éditeur de liens.Réponses:
Vous pourriez envisager d'utiliser Nix , qui est un gestionnaire de packages multi-plateforme à usage général avec un support décent pour Haskell.
Nix a un langage de programmation personnalisé pour définir des packages (qui se trouve être pur, fonctionnel et paresseux). Définir de nouveaux paquets et étendre ceux qui existent est assez facile (par exemple pour modifier les dépendances, obtenir la source d'un autre dépôt git, etc.).
Les packages sont identifiés par des hachages, qui incluent des dépendances. Ainsi, plusieurs versions, ou la même version avec des dépendances différentes, peuvent vivre côte à côte sans conflit. Nix peut rechercher le hachage souhaité sur un serveur de "cache binaire", pour voir si ce paquet particulier avec ces dépendances particulières a déjà été construit; si tel est le cas, il télécharge le produit de génération plutôt que de le compiler.
Actuellement, le référentiel nixpkgs comprend la plupart / la totalité du Hackage, plusieurs versions de GHC (7.10.1, 7.8.4 et certains backends JS) et un
cabal2nix
utilitaire qui fait un très bon travail de génération de packages Nix à partir de fichiers .cabal. Il y a aussi le serveur CI "hydra" basé sur Nix, que vous pouvez utiliser pour déclencher des builds basés sur des validations SCM.la source