对于生态系统的新手来说,目前尚不清楚构建和管理中小型OCaml项目的规范首选方式.我理解ocamlc&c.的基础知识- 它们反映了传统的UNIX C编译器,看起来很简单.但是,高于单个文件的一次性编译水平,目前还不清楚如何最好地简单干净地管理编译.问题不是寻找潜在的工具,而是通过社区的经验验证一种或几种正确的(足够的)方法来构建和构建标准的OCaml项目.
我的模型用例是一个适度但非常重要的项目,纯OCaml或OCaml加上C依赖项.这样一个项目:
几个替代工具脱颖而出:
(我也看过OMake,它似乎是一个自封的" make++",它还包括一套常用语言的标准规则,包括OCaml和ocaml- makenéeOCamlMakefile,为GNU提供标准规则的模板make.)
这些都是管理OCaml构建的首选现代方式吗?
项目文件的结构如何最佳?
如何包含和管理第三方库依赖项?是首选在系统级别安装它们,还是有一种标准和直接的方式在本地管理项目?我更喜欢一种模式,其中项目尽可能保持独立.
我现在用Jane Street的async_core加package(async_core)在_tags.
当我使用时ocamlbuild -use-ocamlfind -I src test/test_airport.native,它给我以下错误:
camlfind ocamlopt -linkpkg -package async_core -package unix -package netclient -package mongo -package xml-light src/airport.cmx test/test_airport.cmx -o test/test_airport.native ocamlfind:包'threads'出错:缺少-thread或-vmthread开关
我用谷歌搜索了这里是我得到的http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual039.html
它说:
使用系统线程的程序必须按如下方式链接:
Run Code Online (Sandbox Code Playgroud)ocamlc -thread other options unix.cma threads.cma other files
所以我改变了我的ocamlbuild命令,如下所示:
ocamlbuild -use-ocamlfind -cflag -thread -I src test/test_airport.native
但错误仍然相同.还有ocamlbuild生成的实际命令保持不变-thread.
我怎么处理这个?
我最近决定在我的项目目录中组织文件.我将我拥有的几种不同文件类型的解析器移动到他们自己的目录中,并决定使用ocamlbuild(因为项目变得越来越复杂,简单的shell脚本不再足够).
我可以用一些基本的规则(修改调用成功myocamlbuild包括外部项目ocaml_lib,我会用ocamlfind其他时间),但我停留在如何将文件夹作为一个模块到项目正常.我创建了一个parser.mlpack文件并填入了要包含的适当模块(例如,"parser/Date"等等),parser.mli在目录的根目录中为它们的实现编写了一个_tags文件,并修改了文件(见下文).
在编译,解析器目录遍历正确的,并且parser.cmi,parser.mli.depends在双双创建_build目录; 以及*.cm[xio]解析器子目录中的所有文件.
我觉得我可能会做一些多余的事情,但无论如何,当我编译时,项目仍然无法找到Parser模块!
谢谢!
_tags
debug : true
<*.ml> : annot
"parser" : include
<parser/*.cmx>: for-pack(Parser)
<curlIO.*> : use_curl
<mySQL.*> : use_mysql
<**/*.native> or <**/*.byte> : use_str,use_unix,use_curl,use_mysql
Run Code Online (Sandbox Code Playgroud)
编译错误
/usr/local/bin/ocamlopt.opt unix.cmxa str.cmxa -g -I /usr/local/lib/ocaml/site-lib/mysql mysql.cmxa -I /usr/local/lib/ocaml/curl curl.cmxa curlIO.cmx utilities.cmx date.cmx fraction.cmx logger.cmx mySQL.cmx data.cmx project.cmx -o project.native
File "\_none\_", line 1, characters 0-1:
Error: **No implementations provided for the …Run Code Online (Sandbox Code Playgroud) 我最近正在阅读一个OCaml项目,我想把源文件放在utop中,这样我就可以做一些实验了.
假设我有两个文件amodule.ml,bmodule.ml.
bmodule.ml将使用amodule.ml中定义的函数,例如,bmodule使用Amodule.anyfunction(),其中anyfunction()在amodule.ml中定义.
我想把它们都放在utop中:
#directory "/directory contain amodule.ml and bmodule.ml"
#use "amodule.ml"
#use "bmodule.ml"
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为Amodule是amodule.ml文件的模块名称,utop不知道这些东西,我想.
那么如何在不改变文件内容的情况下将这些文件放在utop中呢?
我正在尝试创建一个可以在其他OCaml项目中使用的库,我完全迷失了.
我目前正在使用ocamlbuild哪个非常适合吐出可执行文件,但我不知道如何从中获取库.
我发现了-a选项ocamlopt,ocamlc但我不确定如何使用它.我发现的文档(例如,这里)似乎假设了一些预先存在的知识.我甚至都不知道.a文件是什么.运行之后,我需要构建一个依赖于此库的项目的输出文件?我是否需要mli文件以便应用程序知道库代码的签名,或者以某种方式包含在输出中?此外,能够将所有文件打包在一起会很好,类似于Java的.jar文件.
在任何情况下,我都希望能ocamlbuild为我做所有这些,因为如果我必须调用,ocamlopt -a我将不得不手动指定依赖项或破解脚本ocamldep- ocamlbuild应该修复的东西.但是,我不知道如何告诉它建立一个库.
如果有必要,我愿意使用绿洲或OPAM或其他东西,但我想首先使用基本工具学习如何做到这一点.
我想在生成的文档中包含源代码.当我ocamldoc在命令行上调用时,这可以工作:ocamldoc -I _build -html -keep-code -colorize-code *.{ml,mli} -d .docdir.但是,我遇到了麻烦ocamlbuild.
我正在使用以下代码myocamlbuild.ml:
open Ocamlbuild_plugin;;
dispatch begin function
| After_options ->
Options.ocamldoc := S[A"ocamldoc"; A"-keep-code"; A"-colorize-code"]
| _ -> ()
end
Run Code Online (Sandbox Code Playgroud)
但是这只包含没有相应接口文件的文件源 - 与此处所说的相反,它看起来像是在存在文件时ocamlbuild拒绝传递.ml文件.有没有办法哄ocamlbuild做我想要的?ocamldoc.mli
我有一个简单的ocamlbuild项目,它使用Batteries,包括语法扩展.
_tags:
<*>: pkg_batteries,pkg_threads,pkg_batteries.syntax,syntax_camlp4o
Run Code Online (Sandbox Code Playgroud)
something.ml:
open Batteries
…
let () = …
Run Code Online (Sandbox Code Playgroud)
它是为调试而构建的:
$ ocamlbuild something.d.byte
$ ocamldebug something.d.byte
Run Code Online (Sandbox Code Playgroud)
但是,尝试使用该print命令ocamldebug会出现以下错误:
(ocd) print x
Cannot find module Batteries.
Run Code Online (Sandbox Code Playgroud)
这似乎只在一个范围内进行调试时,发生Batteries在open编.
这个错误的原因是什么?如何解决这个问题?
我正在尝试制作这段代码:
open Lwt;;
open Cohttp;;
(* a simple function to access the content of the response *)
let content = function
| Some (_, body) -> Cohttp_lwt_unix.Body.string_of_body body
(* launch both requests in parallel *)
let t = Lwt_list.map_p Cohttp_lwt_unix.Client.get
(List.map Uri.of_string
[ "http://example.org/";
"http://example2.org/" ])
(* maps the result through the content function *)
let t2 = t >>= Lwt_list.map_p content
(* launch the event loop *)
let v = Lwt_main.run t2
Run Code Online (Sandbox Code Playgroud)
但是,当我跑
Ocamlbuild file.native
Run Code Online (Sandbox Code Playgroud)
我得到了未绑定的模块错误.
这些模块是通过opam安装的,当我运行时
ocamlfind query …Run Code Online (Sandbox Code Playgroud) 我发现Menhir提供了--dump和--explain选项,它有助于调试很多.但是如何在ocamlbuild下启用这些选项,以便Menhir始终在编译时生成转储文件?
我试着编写处理自定义标签的myocamlbuild文件menhir_dump,如下所示:
... snip ...
(* OASIS_STOP *)
Ocamlbuild_plugin.dispatch (
MyOCamlbuildBase.dispatch_combine [
(function
| After_rules ->
flag ["menhir_dump"] (S [A "--dump"; A "--explain"])
| _ -> ()
);
dispatch_default
]
)
Run Code Online (Sandbox Code Playgroud)
但是当它编译时,选项被插入到子命令中,并且编译在ocamlc阶段期间失败.
menhir --dump --explain --raw-depend --ocamldep 'ocamlfind ocamldep -modules' src/parser.mly > src/parser.mly.depends
menhir --ocamlc 'ocamlfind ocamlc -g -annot -bin-annot --dump --explain -I src -package cmdliner -package menhirLib -I src' --dump --explain --infer src/parser.mly
+ menhir --ocamlc 'ocamlfind ocamlc -g -annot -bin-annot --dump --explain -I src …Run Code Online (Sandbox Code Playgroud) 我是OCaml的新手,我正试图尝试(:P)Facebook Reason语法.我无法找到一种方法来进行编译,因为如果找不到Core模块(已经安装了opam).
我正在尝试从Real World OCaml编译一个示例程序
open Core.Std;
let rec read_and_accumulate accum => {
let line = In_channel.input_line In_channel.stdin;
switch line {
| None => accum
| Some x => read_and_accumulate (accum +. Float.of_string x)
}
};
let () = printf "Total: %F\n" (read_and_accumulate 0.);
Run Code Online (Sandbox Code Playgroud)
这是我用于编译的命令:rebuild accum.native.
当我有这个_tags(来自https://janestreet.github.io/installation.html中的说明)
true: package(core,ppx_jane)
true: thread,debug
Run Code Online (Sandbox Code Playgroud)
我的错误发生了变化,但我仍然不知道该怎么做:
File "_tags", line 1, characters 6-28:
Warning: tag "package" does not expect a parameter, but is used with parameter "core,ppx_jane"
File "_tags", …Run Code Online (Sandbox Code Playgroud)