Haskell构建和工件环境类似于Maven


20

我曾经是Java开发人员很长一段时间,但是最近我加入了Haskell团队。在Java世界中,如果您有一个大型项目,并且有多个团队在工作,那么一种常见的方法是使用工件服务器(例如Maven)来简化和加速开发。许多构建工具(例如Ant,Maven,Gradle)都可以构建项目并将jar文件上传到工件服务器,团队其他成员可以轻松使用。因此,通过将项目拆分为较小的子项目,还可以大大减少构建时间。

在Haskell方面,我们正在使用cabal该项目。我们的项目大约需要10-15分钟才能完成构建,而无需进行优化。如果打开编译器优化,则需要几个小时,这很痛苦。

我想知道,如何才能像在Java中一样做同样的事情。有没有一种简单的方法可以编译软件包(库)的二进制文件并将其上传到工件服务器,并在构建时使用预构建的二进制文件?我知道,因为Haskell生成机器代码(而不是Java中的字节码),所以可能存在兼容性问题,但是对于存储在工件服务器上的不同体系结构/操作系统,我们可能具有不同的二进制文件。


不是您问题的答案,但是,您是否使用-j选项调用“ cabal构建/安装”?
DanielDíazCarrete

是的,但是我看不到有什么提速。构建时,CPU使用率约为15%-20%。我不知道问题出在哪里:cabalGHCTest.Framework或连接件。
Oxy 2015年

根据这个SO答案stackoverflow.com/questions/27173910/…主要原因是Haskell可执行文件的本机性质。
DanielDíazCarrete

我主要是在谈论发展。的确,由于操作系统,CPU体系结构甚至编译器版本的不同,二进制文件可能会导致不兼容。但是,为什么每天在同一台机器,同一操作系统和同一编译器上进行开发时,我为什么要浪费这么多时间?
Oxy 2015年

它看起来像太平与高速缓存可能是有用的:halcyon.sh/reference/#private-storage-options
卢博米尔Sedlář

Answers:


2

您可能会考虑使用Nix,它是一个通用的,跨平台的软件包管理器,对Haskell具有不错的支持。

Nix具有用于定义程序包的自定义编程语言(恰好是纯函数式,惰性函数)。定义新软件包并扩展现有软件包非常容易(例如,更改依赖关系,从其他git repo获取源代码等)。

包由散列标识,其中包括依赖项。因此,多个版本或具有不同依赖性的相同版本可以并存而不会发生冲突。Nix可以在“二进制缓存”服务器上查找所需的哈希,以查看是否已经构建了具有那些特定依赖项的特定程序包;如果是这样,它将下载构建产品而不是进行编译。

目前,nixpkgs存储库包括大多数/所有Hackage,几个GHC版本(7.10.1、7.8.4和某些JS后端)以及一个cabal2nix实用工具,可以很好地从.cabal文件生成Nix软件包。还有基于Nix的“ hydra” CI服务器,可用于触发基于SCM提交的构建。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.