在OCaml中編寫大型軟件項目的最佳實踐是什麼?在OCaml中設計大型項目
你如何構建你的項目?
OCaml的哪些功能應該也應該不用於簡化代碼管理?例外?一流的模塊? GADTs?對象類型?
構建系統?測試框架?宬?
我發現偉大的recommendations haskell,我認爲這將是一件好事,OCaml類似。
在OCaml中編寫大型軟件項目的最佳實踐是什麼?在OCaml中設計大型項目
你如何構建你的項目?
OCaml的哪些功能應該也應該不用於簡化代碼管理?例外?一流的模塊? GADTs?對象類型?
構建系統?測試框架?宬?
我發現偉大的recommendations haskell,我認爲這將是一件好事,OCaml類似。
我將在我熟悉的條件下回答一箇中等規模的項目,即100K和1M行源代碼以及最多10個開發人員。這是我們使用的是什麼,現在,一個項目兩個月前開始在2013年八月
構建系統和組織代碼:
源代碼編輯:
源的控制和管理:
使用OCaml的安裝:
type t1 = {x:int} type t2 = {x:int;y:int} let t1_of_t2 ({x}:t2) : t1 = {x}
現在工作)庫,協議框架:
「雲」 服務:
測試:
設置這一切有相當多的工作,特別是對不熟悉OCaml的人。目前還沒有框架能夠完成所有這些工作,但至少您可以選擇這些工具。
這一個可能不完全回答你的問題,但這裏是我關於構建環境體驗:
我真的很感激OASIS。它有一套很好的功能,不僅可以幫助構建項目,還可以編寫文檔和支持測試環境。
生成系統
_oasis
文件),它的工作原理基本上與建築物腳本setup.ml
文件。它接受-configure
,-build
,-test
,-distclean
標誌。我在處理不同的GNU和其他通常使用Makefiles的項目時習慣了他們,我發現可以在這裏自動使用它們,這很方便。setup.ml
之外,還可以使用上述所有選項生成Makefile。結構
通常我的項目,該項目是由OASIS建有至少三個目錄:src
,_build
,scripts
和tests
。
_build
目錄受OASIS構建系統的影響。它存儲源文件和目標文件,我喜歡這些構建文件不會受到源文件的干擾,所以我可以很容易地刪除它,以免出現問題。scripts
目錄中存儲多個shell腳本。其中一些用於測試執行和接口文件生成。接口/文檔
使用的接口文件(.mli)有優點和缺點我。它確實有助於查找類型錯誤,但是如果您有它們,則在對代碼進行更改或改進時,也必須對它們進行編輯。有時忘記這會導致令人討厭的錯誤。
但我喜歡接口文件的主要原因是文檔。我使用ocamldoc自動生成(OASIS支持此功能-doc
標誌)html頁面與文檔。在我看來,只需在界面中編寫描述每個函數的註釋就足夠了,而不是在代碼中插入註釋。在OCaml中,函數通常簡短且簡潔,如果需要在那裏插入額外的註釋,可能會更好地分割函數。
也請注意-i
標誌爲ocamlc
。編譯器可以自動生成模塊的接口文件。
測試
我沒有找到支持測試(我想有一些ocamltest
應用程序)一個合理的解決方案,這就是爲什麼我用我自己的腳本執行和驗證用例。幸運的是,當setup.ml
與-test
標誌一起運行時,OASIS支持執行自定義命令。
我不會長時間使用OASIS,如果有人知道其他很酷的功能,我也想知道它們。
另外,它你不知道OPAM,這絕對值得一看。沒有它,安裝和管理新軟件包是一場噩夢。
爲了增加帕維爾答案:
免責聲明:我是OASIS的作者。
OASIS還有oasis2opam,可以幫助快速創建OPAM包和oasis2debian來創建Debian軟件包。如果您想要創建一個「發佈」目標,以自動執行上傳程序包的大部分任務,這非常有用。
OASIS還附帶一個名爲oasis-dist.ml的腳本,該腳本自動創建用於上傳的tarball。
看這一切在https://github.com/ocaml.org。
我用OUnit做了所有的考試。如果你習慣於xUnit測試,這很簡單而且非常高效。
免責聲明:我forge.ocamlcore.org的擁有者/維護者(又名forge.o.o)
如果你想使用git,我建議使用github上。這對審查非常有效。
如果您使用darcs或subversion,您可以在forge.o.o上創建一個帳戶。
在這兩種情況下都有一個公共郵件列表,您必須發送所有提交通知,以便每個人都可以看到它們並對其進行檢查。您可以在forge.o.o上使用Google羣組或郵寄列表。
我建議有一個很好的網頁(github或forge.o.o),並在每次提交時創建OCamldoc文檔。如果您擁有龐大的代碼庫,這將幫助您從頭開始使用OCamldoc生成的文檔(並快速修復它)。
我建議在達到穩定階段時創建tarball。不要只依靠檢查最新的git/svn版本。這個技巧在過去爲我節省了幾個小時的工作。正如馬丁所說,將所有tarball存儲在一箇中心位置(一個git存儲庫是一個好主意)。
如何組織您的項目以將您的單元測試合併到OASIS構建中?你在哪裏放置測試文件,以及如何執行測試?例? – brooks94
爲什麼不是async而不是lwt?那麼不需要任何camlp4。另外,不要在任何地方使用ocamlnet? – rgrinberg
在兩個地方你說OCaml 4.01.0使一些可能的東西。你能說出4.01.0的哪個功能呢?這會改善你已經很好的答案。謝謝。 –
@rginberg OCamlnet是單片機,它的網絡庫不能很好地與Lwt搭配使用。我們使用OCamlnet的Netstring部分的精簡版本,它不依賴於OCamlnet的C代碼。 –