我知道这个问题是相当普遍的,我甚至不知道如何更好地问。
我没有太多的经验, C
,我只是希望我可以做类似的事情,OCaml中的Java编写的。
例如,在Java
,我通常创建一个项目(使用Eclipse
或其他IDE),那么我有一个src
文件夹和一个bin
文件夹。 所有compiled
的东西去bin
。
所以对于首发,我怎么能这样做如上简单的东西? 只是容易裂开的源文件和编译的文件?
通常情况下,你们如何组织OCaml的项目文件?
最后一个问题是,我应该使用mli
或module
? 我注意到ocaml-batteries-included
使用mli
了很多。
有很多不同的关于此主题的OCaml的社会舆论,它真的取决于结构或灵活性你怎么想。 我自己,我用一个makefile和ocamlbuild如果我是懒惰和绿洲的一切。 你应该检查出一些随机OCaml的项目,看看它是如何工作的,你会喜欢什么。 例如绿洲项目看起来可能是这样: https://github.com/avsm/ocaml-github 。 你只需要看看_oasis文件(认为它像pom.xml的,如果你曾经使用Maven的)。 运行oasis setup
应生成所有生成文件的为您服务。 ocaml setup.ml -all
其次是ocaml setup.ml -install
将您的系统上安装该库。
至于使用MLI的。 有争论的关于他们一点点。 下面是从邮件列表的讨论: http://www.mentby.com/Group/caml-list/why-should-i-use-mli-files.html
我自己的看法是,他们是可选的,除非你的模块,这些人将使用公共API的一部分。 在这种情况下,他们是强制性的。
有趣的问题! 我会在看到其他的答案很感兴趣,但这里是我如何组织我的项目:
首先,我使用Eclipse凭借着出色的OCalIDE ,这是一个非常酷的Eclipse插件,积极维护。
如果你是一个Emacs用户,你可以使用TypeRex (这是死的,但随着社会的ocaml的移动速度很慢你把所有的时间)。 如果你是一个Vim的用户,总有Omlet但没有任何非常好的解决方案。
与Eclipse,您可以选择“管理ocaml的项目”,这意味着基本上我不想担心如何编译的东西,我绝不会分享这个项目 。
与启动,这是为个人项目和临时测试不够好。 但是,如果你不能,你将有“Ocaml程序编写的Makefile工程”和“ocaml的项目,ocamlbuild”之间做出选择。 选择Makefile文件,它更灵活,简单的解决方案。
Eclipse会为您提供了Ocaml程序编写项目的缺省Makefile ,在评论很好解释。 我建议你使用它,如果你不熟悉OCaml的构建系统。 如果你是,我建议你使用自己的Makefile,因为默认一个过于庞大且无法读取(我认为)。
太好了! 现在,我们有我们的项目在我们喜欢的编辑器,并准备把一个全球性的结构!
在项目的根,我遵循GNU经典的压缩包,那说的约定:
/
|- src/ # source files
|- lib/ # dependencies
|- test/ # tests files and test binaries
|- _build/ # binaries and object files, sometimes managed by ocamlbuild
|- AUTHORS # who did that marvelous stuff
|- README # what is it
|- Makefile # *always* provide a Makefile, you never know...
|- _tags # when I use ocamlbuild
|- _oasis # when I use oasis
有时候,没有lib目录,这是很好的。 但是因为它的宁静正为你的项目,你应该提供一个作者和README文件。
这是令人厌烦的部分,怎么样的src目录?
- OCaml的模块化系统是在自己的容器使事情非常有帮助。 我注意到在我自己的经验是:
- 我不使用内部模块的任何东西,但函子
- 我把我的模块一致的自己(某种金科玉律)。 对于我的名字的模块大多涉及到的数据类型或特定的容器与内部状态(什么叫javaists单身)
- 我经常做两个三个明显的特定模块:入口点,它包含了所有常见类型的模块,并且包含了所有常用的功能模块。 它避免循环依赖。
我把所有单位在src/
目录中,除非我真的可以看到在我的模块结构(那些被解析,这些都是AI运算,这些都是网络......)。 用同样的方法我使用C项目。
OCaml的是一个简洁的语言,所以你应该有一些文件。 至于对于C项目,尝试过让你的目录结构尽可能平坦,记住该目录不是模块名称或命名空间的一部分,所以它只是程序员的便利!
- 该MLI部分:这真的取决于你的项目目标。 这是我的方法:
- 唯一的一般规则是:如果存在记录的MLI。 MLIS来这里是为了帮助编译器和程序员。
- 这对你来说? 在毫升部分文档并生成仅用于键入约束或过大的对浏览毫升MLI。
- 你想发布你的项目? 在MLI文件,因为第一个文件,如果我们有选择,我们将阅读。 选择您将生成接口文件,也许有些是内部,你不希望他们被普通用户读取。
- 当你处理OCaml的对象系统,因为它可以变得凌乱的非常快,他们总是需要的。
在一般情况下,我很高兴地让我的美林尽可能少所以客人会立即知道哪些文件是很好的了解,哪些是内部/高级。
此外,它有助于对重构,因为我没有类型约束阻止我走在前面。
请记住,测试套件是在这里,以确保我们不会打破任何东西(见OUnit ,你的发行版应该已经打包了一个给你。这很简单,高效,良好的项目)。
这就是我看到的。 希望这将帮助任何人!