OCamlで大規模なソフトウェアプロジェクトを作成するためのベストプラクティスは何ですか?
プロジェクトをどのように構成しますか?
コード管理を簡素化するためにOCamlのどの機能を使用すべきか、使用すべきではありませんか?例外?ファーストクラスのモジュール? GADT?オブジェクトタイプ?
システムを構築しますか?テストフレームワーク?ライブラリスタック?
私はhaskellにとって素晴らしい recommendations を見つけました、そして私はOCamlのために似たようなものを持っているのは良いことだと思います。
私が精通している条件、つまり10万から100万行のソースコードと最大10人の開発者の中規模のプロジェクトに答えるつもりです。これは、2か月前の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には、OPAMパッケージをすばやく作成するのに役立つoasis2opamと、Debianパッケージを作成するためのoasis2debianもあります。これは、パッケージをアップロードするためのほとんどのタスクを自動化する「リリース」ターゲットを作成する場合に非常に役立ちます。
OASISには、アップロード用のtarballを自動的に作成するoasis-dist.mlというスクリプトも付属しています。
これをすべて https://github.com/ocaml.org で見てください。
OUnit を使用してすべてのテストを実行します。 xUnitのテストに慣れている場合、これは単純で非常に効率的です。
免責事項:私はforge.ocamlcore.org(別名forge.o.o)の所有者/保守者です
Gitを使用したい場合は、githubを使用することをお勧めします。これはレビューに非常に効率的です。
DarcsまたはSubversionを使用している場合は、forge.o.oでアカウントを作成できます。
どちらの場合も、すべてのコミット通知を送信する公開メーリングリストを用意しておく必要があります。そうすれば、誰もがそれらを表示して確認できます。 Googleグループまたはforge.o.oのメーリングリストのいずれかを使用できます。
コミットするたびに、OCamldocドキュメントを含むNice Web(githubまたはforge.o.o)ページを作成することをお勧めします。巨大なコードベースがある場合、これはOCamldocで生成されたドキュメントを最初から使用するのに役立ちます(そしてそれをすばやく修正します)。
安定した段階になったら、タールボールを作ることをお勧めします。最新のgit/svnバージョンをチェックするだけに頼らないでください。このヒントにより、過去の作業時間を節約できました。 Martinが言ったように、すべてのtarballを中央の場所に保存します(gitリポジトリはそのための良いアイデアです)。
これはおそらくあなたの質問に完全には答えませんが、ビルド環境に関する私の経験は次のとおりです。
本当に感謝しています [〜#〜] oasis [〜#〜] 。プロジェクトの構築だけでなく、ドキュメントの作成やテスト環境のサポートにも役立つ、優れた機能セットを備えています。
ビルドシステム
setup.ml
ファイル(_oasis
ファイル)を生成します。これは、基本的にビルドスクリプトとして機能します。 -configure
、-build
、-test
、-distclean
フラグを受け入れます。さまざまなGNUや、通常Makefileを使用する他のプロジェクトで作業している間、私はそれらにかなり慣れていました。ここでそれらすべてを自動的に使用できると便利です。setup.ml
を生成する代わりに、上記のすべてのオプションを使用してMakefileを生成することもできます。構造
通常、OASISによって構築された私のプロジェクトには、少なくとも3つのディレクトリがあります:src
、_build
、scripts
、およびtests
。
_build
ディレクトリは、OASISビルドシステムの影響下にあります。ソースファイルとオブジェクトファイルの両方がそこに保存され、ビルドファイルがソースファイルに干渉しないのが好きなので、何か問題が発生した場合に簡単に削除できます。scripts
ディレクトリに保存します。それらのいくつかは、テストの実行とインターフェイスファイルの生成用です。インターフェース/ドキュメント
インターフェイスファイル(.mli)の使用には、私にとって長所と短所の両方があります。タイプエラーを見つけるのは本当に役立ちますが、タイプエラーがある場合は、コードを変更または改善するときにもそれらを編集する必要があります。これを忘れると、厄介なエラーが発生することがあります。
しかし、私がインターフェースファイルが好きな主な理由はドキュメントです。 ocamldoc を使用して、ドキュメントを含むhtmlページを自動的に生成します(OASISはこの機能を-doc
フラグでサポートします)。私の意見では、インターフェイスの各関数を説明するコメントを記述し、コードの途中にコメントを挿入しないで十分です。 OCamlでは、関数は通常短く簡潔であり、そこに追加のコメントを挿入する必要がある場合は、関数を分割する方がよい場合があります。
ocamlc
の-i
フラグにも注意してください。コンパイラは、モジュールのインターフェイスファイルを自動的に生成できます。
テスト
テストをサポートするための合理的な解決策が見つかりませんでした(ocamltest
アプリケーションが欲しい)。そのため、ユースケースの実行と検証に独自のスクリプトを使用しています。幸い、OASISは、setup.ml
が-test
フラグで実行されている場合のカスタムコマンドの実行をサポートしています。
私はOASISを長い間使用していません。他の優れた機能を知っている人がいたら、それらについても知りたいと思います。
また、あなたが気づいていないなら [〜#〜] opam [〜#〜] 、それは間違いなく一見の価値があります。それがなければ、新しいパッケージをインストールして管理することは悪夢です。