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