
2026/06/05 2:52
OCamlオンボーディング:Duneビルドシステムへの入門
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
この記事は、OCaml エコシステムへの新規参入者にとっての実用的な入り口となり、特に初期段階では自動コード生成に依存せずに Dune 3.15 を用いて新项目をセットアップする方法に焦点を当てています。単純な「helloer」の例——
dune-project(Cram テストの有効化などメタデータの指定)と dune(cmdliner を用いたライブラリや実行可能ファイル、そして alcotest を用いたテストの指定)で定義されたフラットな構造——を用いて、このチュートリアルはビルドシステムの内部動作を説明します。読者は、すべてのターゲットをビルドするコマンド(dune build @all)、ドキュメントを生成する(@doc)、バイナリを実行する(dune exec)、および Cram や ALCOTest などのフレームワークを用いてテストを実行する具体的なコマンドを学びます。コンテキストは「Opam 103」ブログシリーズを通じて提供され、OCamlPro のツールチェーンに対する寄与に関する情報も含まれています。このガイドは、ユーザーを将来的なセットアップのためにこれらの手動ステップから dune init などの自動スキャファルディングツールへの移行へと導き、開発者が効果的に一貫したプロジェクト構造を設定することを可能にします。本文
サハラ砂漠の真ん中に、丘の上に座る駱駝 — OCaml プロジェクト構築のための実践的ガイド
2025 年 7 月 29 日
ハードハットを被ったまま、OCaml コードの記述や実行で忙しかった時間を一息ついています。ご自身でも OCaml プロジェクトを開始されたいですか?以下の手順に従ってみてください。
📖 はじめに
本記事では、OCaml エコシステムへの初心者の方のために、もう一つの実践的なガイドをお届けします。
- 背景: OCaml ディストリビューションを手始めとする際に困難を感じることは多くあります。
- 目的: 最新の記事「Opam 103:opam を使用して新しい OCaml プロジェクトを構築する」の文脈から、初心者の方にも円滑なオンボーディングが可能なガイドをまとめました。
- アプローチ: ツールチェーンの暗黙知を明示し、ゼロから始める重要性を再確認します。
💡 驼駝技術者の基礎:Dune
OCaml に初めて触れる場合、最初の課題はコードのビルド・実行・テストです。そのために広範に普及している強力なビルドシステム、Duneが不可欠です。本ガイドでは Dune の使用方法を要点のみで紹介します。
📚 リソースと準備
本記事は、opam と dune のワークフロー連携を示すことを目的としています。
- 参考プロジェクト:
(簡潔なサンプル)helloer - 学習順序:
- 内部動作原理を理解する(手動設定から)。
- 公式ドキュメントやコミュニティにアクセスする。
参考リンク
- Opam 103 記事 (前記事:opam ファイルの作成)
- Dune 公式ドキュメント
🛠️ プロジェクト構造と設定ファイル
Dune 駆動なプロジェクトは、ルートディレクトリに特定のファイルを置く必要があります。
dune-project
ファイル
dune-projectプロジェクトのエントリポイントです。メタデータを定義し、opam などのツールにも連携します。
必須項目:
- バージョン指定: 第一行には必ず
を記述(コメント不可)。これが認識する機能と構文を決定します。(lang dune X.Y)
$ cat dune-project (lang dune 3.15) (package (name helloer)) (cram enable)
主な設定内容:
- Dune のバージョン;
- プロジェクトライフサイクル URL;
- ライセンス設定やドキュメント生成オプション;
- opam ファイルの自動生成設定(詳細は Opam 103 を参照)。
dune
ファイル
dune特定のディレクトリ内の OCaml コードのコンパイル方法を Dune に指示するビルド仕様ファイルです。
サンプル構造 (
プロジェクト):helloer
- ライブラリ、実行可能プログラム、テストの 3 つターゲットを定義。
$ cat dune (library (name helloer_lib) (modules helloer_lib) ) (executable (public_name helloer) (name helloer) (libraries cmdliner helloer_lib) (modules helloer) ) (test (name test) (libraries alcotest helloer_lib) (modules test) )
伝達される情報:
- 各ディレクトリ内の OCaml ファイルのコンパイル方法;
- ライブラリ、実行可能プログラム、テストターゲットの定義。
🧩 Dune の主要なステンス(節)
Dune では設定ブロックをステンスと呼びます。ビルドシステムへのアーティファクト定義を伝達します。
1. ライブラリ ステンス
(library (name helloer_lib) (modules helloer_lib) )
- 目的:
という名の再利用可能なライブラリを定義。helloer_lib - デフォルト動作:
から構築され、公開 API として利用されるモジュールのみをリストします。helloer_lib.ml
2. 実行可能プログラム ステンス
(executable (public_name helloer) (name helloer) (libraries cmdliner helloer_lib) (modules helloer) )
- 目的: コードをランナブルなバイナリとしてバンドル。
- 主要フィールド:
: バイナリ名(例:name
)。helloer
: opam ファイルやインストール時のパブリック名。public_name
: 依存ライブラリ(外部のlibraries
、内部のcmdliner
)。helloer_lib
3. テスト ステンス
(test (name test) (libraries alcotest helloer_lib) (modules test) )
- 目的:
に定義されたテストターゲットを登録。test.ml - 動作:
を呼び出すと自動的にコンパイル・実行されます(例:dune runtest
使用)。alcotest
🚀 プロジェクトのビルドと実行
dune build @all
dune build @all全ターゲット(ライブラリ、実行可能プログラム、テスト、ドキュメントなど)を構築します。
$ dune build @all
確認すべき内容:
に以下が生成されるか:_build/default/
(実行可能プログラム)helloer.exe
(ビルド済みライブラリ)helloer_lib.cmxs
(テスト用バイナリ)test.exe
⚠️ エイリアス:
や@docなどのカスタムエイリアスを定義することも可能です。@runtest
dune build @doc
(ドキュメント生成)
dune build @docAPI ドキュメントを生成します(
odoc が使用されます)。
$ dune build @doc
- 結果:
に HTML ファイルが生成。_build/default/_doc/_html/index.html - 条件:
のdune-project
ステンスが含まれており、コードに OCaml コメント((package ...)
)があること。(** *)
表示方法:
$ open _build/default/_doc/_html/index.html
dune exec --
(実行)
dune exec --ビルド済みの実行可能プログラムを即座に実行します。
$ dune exec -- ./helloer.exe Hello OCamlers!! $ dune exec -- ./helloer.exe --gentle Welcome my dear OCamlers.
注意点:
以降の最初の項目は実行可能プログラムの相対パスまたはパブリック名。--- その後の引数はそのままプログラムに渡されます。
- 必要に応じて、ステンスに
を追加し、プロジェクトルートへコピーできます。(promote (until-clean))
🧪 Dune を用いたプロジェクトのテスト
helloer ではライブラリテストには alcotest、実行可能プログラムテストには cramを使用しています。
1. cram テスト
出力を正確にチェックするテスト形式です。
.t ファイルにシェルセッションのような記述を含めます。
$ helloer Hello OCamlers!! $ helloer --gentle Welcome my dear OCamlers.
動作:
ファイル内のコマンドを実行;.t- バイナリの標準出力(stdout)を期待される出力と比較;
- 一致しない場合はテスト失敗。
2. dune runtest
dune runtestすべてのテストを起動・実行します。
$ dune runtest Testing `Tests'. This run has ID `N39NJ5ZE'. [OK] messages 0 normal. [OK] messages 1 gentle. Full test results in `~/ocamler/dev/helloer/_build/default/_build/_tests/Tests'. Test Successful in 0.000s. 2 tests run.
失敗時の挙動:
- 出力が一致しない場合、修正済みの出力ファイル(
)と共にエラーレポートを表示します。.corrected - 自動的に新しい出力をテストに反映させることも可能です。
⚡️ dune init
によるスケルトン作成
dune initすべてのファイルをゼロから手書きする代わりに、Dune がコマンドラインツールを提供します。これにより堅固な構造が即座に構築されます。
プロジェクト作成
$ dune init project helloer
生成される内容:
- 新しいディレクトリ
の作成;helloer
ファイルの設定;dune-project- サンプルソースファイルとビルドファイル(
,bin/
,lib/
など)の追加。test/
得られる構造例:
helloer/ ├── bin/ │ ├── dune │ └── main.ml ├── dune-project ├── lib/ │ └── dune └── test/ ├── dune ├── test_helloer.ml └── [...]
テンプレートの使い分け
- 単なるライブラリのみ:
dune init lib helloer - バイナリ(実行可能プログラム)のみ:
dune init exec helloer
まとめ
本記事では Dune ベースの OCaml プロジェクト構築を解説しました。
- 基本フロー: スケルトン作成 → 設定(メタデータとステンス) → ビルド → 実行 → テスト
- Dune の役割:
- ビルドスクリプトの代替機能を提供;
- ライブラリ、実行可能プログラム、ドキュメント生成を一元的に管理。
OCaml と Dune に慣れれば、さらに高度な機能を発見できるでしょう。実用的なアプリケーション構築のための基礎はここで整いました。
🏢 OCamlPro について
OCamlPro は 2011 年に設立された R&D ラボです。最先端のプログラミング言語理論と実践に関する専門知識を持つ専門家から産業ユーザーに恩恵をもたらすことを使命としています。
提供サービス
- 高機能言語・レガシー言語対応: Rust, Wasm, OCaml および COBOL、独自ドメイン固有言語(DSL)向けの監査、サポート、カスタム開発者ツール、トレーニング。
- ソフトウェア開発: 複雑なシステムの設計・作成・実装(博士号レベルの専門家による対応)。
実績例
- フランス国税庁の内部言語
の再構築・改善支援。M - 映画業界向け収益ストリームモデル化 DSL「Niagara」の設計。
- Tezos ブロックチェーンプロトタイプ開発(2014〜2018)。
オープンソースへの貢献
- Opam パッケージマネージャの開発。
- LearnOCaml ウェブプラットフォームの提供。
- Flambda オプティマイジングコンパイラへのコントリビューション。
- GnuCOBOL コンパイラへのコントリビューション。
- Alt-Ergo SMT ソルバーの開発(プログラムの安全性・セキュリティ証明用)。
お問い合わせ
ご相談をお楽しみいたします:
- メール: contact@ocamlpro.com
- 予約: サンプル議論をお気軽にお試しください。