OCamlプログラムをduneを使用してビルドしている場合、インストールする時にバイナリファイル以外のファイルも一緒にコピーしたい場合があると思います。
それをopam、duneを使用している時にどのように行うか調べました。
Duneの設定
設定はduneファイルにStanzaの設定を追加するだけです。
dune.readthedocs.io
filesにコピーしたいファイル、sectionにコピー先、packageにパッケージ名を指定します。
パッケージ管理にopamを利用している場合は、/[ホームディレクトリ]/.opam/[コンパイラバージョン]/[Sectionで指定したカテゴリ]/[パッケージ名] にファイルがコピーされます。
具体的には /Users/holyshared/.opam/4.09.0/share/ogenになります。
(install
(files ../templates/opam.mustache ../templates/default.mk)
(section share)
(package my_package)
)
大抵の場合はexecutable, executables stanzaのいずれかと一緒に指定する事になると思います。
(executables
(names main)
(public_names ogen)
(libraries ogen cmdliner)
)
(install
(files ../templates/opam.mustache ../templates/default.mk)
(section share)
(package my_package)
)
プログラムからのファイルの参照
インストール時にコピーしたファイルを読み込んだりしたい時、opamの場合はパスを環境変数のOPAM_SWITCH_PREFIXを利用して解決します。
OPAM_SWITCH_PREFIX は /[ホームディレクトリ]/.opam/[コンパイラバージョン]/ になります。
これはopamでコンパイラのバージョン切り替えたりしても正しく切り替わります。
この環境変数は /[ホームディレクトリ]/.opam/opam-init/variables.sh に定義されています。
後はプログラムで Sys.getenv_opt などを利用してパスを取得します。
let prefix = match Sys.getenv_opt "OPAM_SWITCH_PREFIX" with
| Some v -> v
| None -> ""
パッケージのインストール
パッケージのインストールはビルドした後に、installコマンドを実行することでローカルにインストールできます。
dune build
dune install