在OCaml中编写大型软件项目的最佳实践是什么?
您如何构建项目?
应该和不应该使用OCaml的哪些功能来简化代码管理?例外?一流的模块? GADTs?对象类型?
构建系统?测试框架?图书馆堆栈?
我发现haskell很棒recommendations,我认为为OCaml提供类似的东西会很好。
答案 0 :(得分:59)
我将在我熟悉的条件下回答一个中型项目,即100K到1M行的源代码和最多10个开发人员。对于两个月前在2013年8月开始的项目,这就是我们现在所使用的。
构建系统和代码组织:
源代码编辑:
来源控制和管理:
使用OCaml:
type t1 = {x:int} type t2 = {x:int;y:int} let t1_of_t2 ({x}:t2) : t1 = {x}
现在有效)图书馆,协议,框架:
“云”服务:
测试:
设置这一切是相当多的工作,特别是对于不熟悉OCaml的人。目前还没有框架可以处理所有这些,但至少你可以选择工具。
答案 1 :(得分:10)
添加到Pavel回答:
免责声明:我是OASIS的作者。
OASIS还有oasis2opam可以帮助快速创建OPAM包,oasis2debian可以创建Debian包。如果您想创建一个“发布”目标来自动完成上传包的大部分任务,这非常有用。
OASIS还附带了一个名为oasis-dist.ml的脚本,可自动创建tarball以供上传。
在https://github.com/ocaml.org中查看所有这些内容。
我使用OUnit来完成所有测试。如果您习惯于xUnit测试,这很简单且非常有效。
免责声明:我是forge.ocamlcore.org(又名forge.o.o)的所有者/维护者
如果你想使用git,我建议使用github。这对于审核非常有效。
如果你使用darcs或subversion,你可以在forge.o.o上创建一个帐户。
在这两种情况下都有一个公共邮件列表,您发送所有提交通知是必须的,以便每个人都可以看到并审查它们。您可以使用forge.o.o上的Google网上论坛或邮件列表。
我建议每次提交时都有一个很好的web(github或forge.o.o)页面,其中包含OCamldoc文档构建。如果你有一个庞大的代码库,这将帮助你从一开始就使用OCamldoc生成的文档(并快速修复)。
我建议您在达到稳定阶段时创建tarball。不要只依赖于检查最新的git / svn版本。这个提示在过去节省了我几个小时的工作。正如Martin所说,将所有tarball存储在一个中心位置(git存储库是一个好主意)。
答案 2 :(得分:5)
这个可能不完全回答你的问题,但这是我对构建环境的经验:
我非常感谢OASIS。它有一套很好的功能,不仅有助于构建项目,还有助于编写文档和支持测试环境。
构建系统
setup.ml
文件)生成_oasis
文件,该文件基本上用作构建脚本。它接受-configure
,-build
,-test
,-distclean
个标记。我在使用不同的GNU和其他通常使用Makefiles的项目时非常习惯它们,我觉得很方便可以在这里自动使用所有这些。 setup.ml
之外,还可以生成包含上述所有选项的Makefile。<强>结构强>
通常我的OASIS构建的项目至少有三个目录:src
,_build
,scripts
和tests
。
_build
目录受OASIS构建系统的影响。它存储源文件和目标文件,我喜欢这些构建文件不会干扰源文件,因此我可以轻松删除它,以防出现问题。scripts
目录中存储了多个shell脚本。其中一些用于测试执行和接口文件生成。<强>接口/文档强>
使用接口文件(.mli)对我来说既有优点也有缺点。找到类型错误确实很有帮助,但是如果你有错误,那么在对代码进行更改或改进时也必须编辑它们。有时忘记这会导致令人讨厌的错误。
但我喜欢界面文件的主要原因是文档。我使用ocamldoc生成(OASIS支持带有-doc
标记的此功能)html页面自动生成文档。在我看来,编写描述接口中每个函数的注释就足够了,而不是在代码中间插入注释。在OCaml中,函数通常简洁明了,如果有必要在那里插入额外的注释,可能最好将函数拆分。
另请注意-i
的{{1}}标记。编译器可以自动为模块生成接口文件。
<强>测试强>
我没有找到支持测试的合理解决方案(我希望有一些ocamlc
应用程序),这就是我使用自己的脚本来执行和验证用例的原因。幸运的是,当ocamltest
以setup.ml
标志运行时,OASIS支持执行自定义命令。
我很长时间没有使用OASIS,如果有人知道其他很酷的功能,我也想知道它们。
另外,你不知道OPAM,绝对值得一看。没有它,安装和管理新包装就是一场噩梦。