2015-07-19 100 views
6

我是Ocaml的新手,剛剛用emacs,merlin和flycheck設置了我的開發環境。除了一件事情之外,一切都會或多或少地發揮作用:merlin似乎無法識別同一項目中模塊之間的依賴關係。Merlin抱怨同一個項目中缺少一個模塊

例如我有兩個模塊的測試項目:main.ml和awesome.ml。

這裏是我的main.ml它引用的第二模塊awesome.ml

(* main.ml *) 
open Core 
module A = Awesome 
let _ = 
    Printf.printf "hello \n Converted to string we get: %s\n" 
    (A.str_of_t (A.succ A.one_t)); 

這裏是awesome.ml:

(* awesome.ml *) 
type t = int 
let one_t = 1 
let succ i = i + 1 
let str_of_t = string_of_int 

當我發送main.ml緩衝,以評估爲UTOP與utop-eval-buffer函數,我得到一個錯誤:「Error:Unbound module Awesome」

我有.merlin在有S指令的項目的根目錄下。 我知道它是由梅林發現,因爲它不抱怨「開核」

S src 
PKG core lwt ounit 
B _build/src 
B +threads 

這裏是我的_tags:

<src/**>: include 
<src/**>: package(oUnit), package(core) 
true:thread 

與ocamlbuild經常項目編制工作正常,沒有錯誤。 這裏是Makefile中

## Makefile 
default: main 
main: main.native 

test: test.native 

%.native: 
    ocamlbuild -use-ocamlfind [email protected] 
    mv [email protected] $* 

.PHONY: test default 

爲什麼真棒模塊沒有UTOP承認或這是預期的行爲的任何想法?

+4

不,我不知道;我不抱怨 – Merlin

回答

10

Merlin在編譯完成後會看到其他模塊(事實上,一旦編譯了它的接口)。所以考慮到你的.merlin是正確的,它會看到你運行編譯後的一切。您的文件確實應該在一個src文件夾,也就是你的項目佈局,根據你的.merlin文件應該是這樣的:

Makefile 
.merlin 
src/ 
    awesome.ml 
    main.ml 

這不是必需的佈局,但這是一個,你描述梅林。原因,爲什麼我懷疑它不一樣,是你的Makefile

P.S.正如旁註所示,代碼中存在一個小問題:您應該打開Core.Std而不是Core

+0

謝謝伊萬。它仍然不起作用。我有一個正確的項目佈局 - 源代碼位於src目錄中,.merlin位於項目的根目錄中。 B +線程指令的原因在這裏:https://github.com/the-lambda-church/merlin,我加入了merlin文檔中的建議。你對開放Core.Std是正確的。我運行了編譯 - 源代碼編譯正確,我在_build/src中看到了o個文件,但merlin仍然無法識別awesome.ml模塊。看起來我的設置有問題 - 我會繼續挖掘。謝謝! –

+0

我懷疑你的makefile有問題,但它不能編譯任何東西。因此,如果沒有'Makefile'文件,如果我只要到項目的頂層目錄併發出'ocamlbuild src/main.native',那麼merlin就會識別出'Awesome'模塊。基本上,你'Makefile'對我來說看起來不正確。它只是不編譯任何東西。一個好的檢查:運行構建後應該有'_build/src/awesome.cmi'文件。 – ivg

+0

nope,makefile是很好的 - 它編譯,產生一個二進制主,我可以執行。 awesome.cmi/awesome.cmo/awesome.cmt/awesome.cmti/awesome.cmxare在_build/src中生成 –

1

正如Ivan's answer所指出的那樣,Merlin在編譯之後只能識別項目中的模塊。如果梅林是給你一個unbound module Foo錯誤,一個解決方案是運行

ocamlbuild foo.cmi 
+0

這實際上完全解決了它,我不知道爲什麼。 ocamlbuild以某種方式保存狀態?我很新,所以完全有可能我只是不知道整個開發環境的工作原理。^ – Jay

+0

Ocamlbuild會將「foo.cmi」接口文件保存在「_build」目錄中。我猜想我認爲這是「保存狀態」。 – hugomg

+0

哦,這很有道理。我認爲Merlin正在看第二個,我猜想沒有構建文件。猜猜我錯了! – Jay

0

我有同樣的問題。我嘗試通過opam或源代碼安裝merlin,但直到我將「.merlin」文件放入\ src目錄中(而不是在根目錄中),並在其中帶有「REC」標記時才能解決此問題。

相關問題