在 OCaml 中编写大型软件项目的最佳实践是什么?
你如何组织你的项目?
OCaml 的哪些特性应该和不应该用于简化代码管理?例外?一流的模块?GADT?对象类型?
构建系统?测试框架?宬?
我为 haskell 找到了很好的建议,我认为为 OCaml 提供类似的东西会很好。
在 OCaml 中编写大型软件项目的最佳实践是什么?
你如何组织你的项目?
OCaml 的哪些特性应该和不应该用于简化代码管理?例外?一流的模块?GADT?对象类型?
构建系统?测试框架?宬?
我为 haskell 找到了很好的建议,我认为为 OCaml 提供类似的东西会很好。
我将在我熟悉的条件下回答一个中型项目,即源代码行数在 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 的人。目前还没有框架可以解决所有这些问题,但至少您可以选择工具。
要添加到 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 上创建一个帐户
在这两种情况下,必须有一个公共邮件列表,您可以在其中发送所有提交通知,以便每个人都可以看到它们并查看它们。您可以使用 Google 群组或 forge.oo 上的邮件列表
我建议每次提交时都构建一个带有 OCamldoc 文档的漂亮 Web(github 或 forge.oo)页面。如果您拥有庞大的代码库,这将帮助您从一开始就使用 OCamldoc 生成的文档(并快速修复它)。
我建议您在达到稳定阶段时创建 tarball。不要仅仅依靠查看最新的 git/svn 版本。这个技巧在过去为我节省了几个小时的工作时间。正如 Martin 所说,将所有 tarball 存储在一个中心位置(一个 git 存储库是一个好主意)。
这可能无法完全回答您的问题,但这是我关于构建环境的经验:
我非常感谢绿洲。它有一组很好的特性,不仅有助于构建项目,还有助于编写文档和支持测试环境。
构建系统
setup.ml
从规范(_oasis
文件)生成文件,它基本上作为构建脚本工作。它接受-configure
, -build
, -test
,-distclean
标志。在使用不同的 GNU 和其他通常使用 Makefile 的项目时,我已经习惯了它们,并且我发现可以在这里自动使用所有它们很方便。setup.ml
generate 之外,还可以使用上述所有可用选项生成 Makefile。结构
通常我的 OASIS 构建的项目至少有 3 个目录:src
、_build
和.scripts
tests
_build
目录受OASIS 构建系统的影响。它将源文件和目标文件都存储在那里,我喜欢构建文件不受源文件的干扰,所以我可以很容易地删除它,以防出现问题。scripts
我在目录中存储了多个 shell 脚本。其中一些用于测试执行和接口文件生成。接口/文档
使用接口文件 (.mli) 对我来说既有优点也有缺点。查找类型错误确实很有帮助,但如果你有它们,你在对代码进行更改或改进时也必须编辑它们。有时忘记这一点会导致严重的错误。
但我喜欢接口文件的主要原因是文档。我使用ocamldoc自动生成(OASIS 支持带有-doc
标志的此功能)带有文档的 html 页面。在我看来,在界面中编写描述每个函数的注释就足够了,而不是在代码中间插入注释。在 OCaml 中,函数通常简短而简洁,如果需要在此处插入额外的注释,那么拆分函数可能会更好。
还要-i
注意ocamlc
. 编译器可以自动为模块生成接口文件。
测试
我没有找到支持测试的合理解决方案(我想要一些ocamltest
应用程序),这就是为什么我使用自己的脚本来执行和验证用例。幸运的是,OASIS 支持setup.ml
在使用-test
flag 运行时执行自定义命令。
我很长时间没有使用 OASIS,如果有人知道任何其他很酷的功能,我也想知道它们。
此外,如果您不了解OPAM,它绝对值得一看。没有它,安装和管理新软件包就是一场噩梦。