OCaml
راهنمای کاربر
کتابخانههای OCaml در مجموعه صفاتهایی به شکل ocaml-ng.ocamlPackages_X_XX در دسترس هستند که در آن X باید با نسخه کامپایلر مورد نظر جایگزین شود. به عنوان مثال، ocamlgraph کامپایلشده با OCaml 4.12 را میتوان در ocaml-ng.ocamlPackages_4_12.ocamlgraph یافت. خود کامپایلر نیز در همین مجموعه و تحت نام ocaml قرار دارد.
اگر نسخه دقیق کامپایلر برایتان مهم نیست، ocamlPackages یک نام مستعار سطح بالا است که به نسخه جدیدی از OCaml اشاره میکند.
برنامههای OCaml معمولاً در سطح بالا در دسترس هستند، نه در داخل ocamlPackages. استثناهای مهم، ابزارهای ساخت هستند که باید با همان نسخه کامپایلری ساخته شوند
let
pkgs = import <nixpkgs> { };
# choose the ocaml version you want to use
ocamlPackages = pkgs.ocaml-ng.ocamlPackages_4_12;
in
pkgs.mkShell {
# build tools
nativeBuildInputs = with ocamlPackages; [
ocaml
findlib
pkgs.dune
ocaml-lsp
];
# dependencies
buildInputs = with ocamlPackages; [ ocamlgraph ];
} .version{'}'}/site-lib/``
$OCAMLPATHnix-shellbuildDunePackagebuildInputspropagatedBuildInputsminimalOCamlVersionfetchFromGitHubdune
{
lib,
fetchFromGitHub,
buildDunePackage,
ocaml,
ocaml-syntax-shims,
alcotest,
result,
bigstringaf,
ppx_let,
}:
buildDunePackage (finalAttrs: {
pname = "angstrom";
version = "0.15.0";
minimalOCamlVersion = "4.04";
src = fetchFromGitHub {
owner = "inhabitedtype";
repo = "angstrom";
tag = finalAttrs.version;
hash = "sha256-MK8o+iPGANEhrrTc1Kz9LBilx2bDPQt7Pp5P2libucI=";
};
buildInputs = [ ocaml-syntax-shims ];
propagatedBuildInputs = [
bigstringaf
result
];
doCheck = lib.versionAtLeast ocaml.version "4.05";
checkInputs = [
alcotest
ppx_let
];
meta = {
homepage = "https://github.com/inhabitedtype/angstrom";
description = "OCaml parser combinators built for speed and memory efficiency";
license = lib.licenses.bsd3;
maintainers = with lib.maintainers; [ sternenseemann ];
};
}) در اینجا مثال دوم آمده است، این بار با استفاده از یک آرشیو کد منبع که با dune-release تولید شده است. استفاده از این آرشیو در صورت در دسترس بودن اقدام مناسبی است، زیرا معمولاً شامل متغیرهای جایگزینشدهای مانند فیلد %%VERSION%% است. این کتابخانه به هیچ کتابخانه OCaml دیگری وابسته نیست و پس از ساخت آن هیچ تستی اجرا نمیشود.
{
lib,
fetchurl,
buildDunePackage,
}:
buildDunePackage (finalAttrs: {
pname = "wtf8";
version = "1.0.2";
minimalOCamlVersion = "4.02";
src = fetchurl {
url = "https://github.com/flowtype/ocaml-wtf8/releases/download/v${finalAttrs.version}/wtf8-v${finalAttrs.version}.tbz";
hash = "sha256-d5/3KUBAWRj8tntr4RkJ74KWW7wvn/B/m1nx0npnzyc=";
};
meta = {
homepage = "https://github.com/flowtype/ocaml-wtf8";
description = "WTF-8 is a superset of UTF-8 that allows unpaired surrogates";
license = lib.licenses.mit;
maintainers = [ lib.maintainers.eqyiel ];
};
}) اگر دو نسخهٔ متفاوت از یک کتابخانه به buildInputs اضافه شوند (که معمولاً به صورت متعدی و به دلیل propagatedBuildInputs رخ میدهد)، ساخت به طور خودکار با شکست مواجه خواهد شد. برای غیرفعال کردن این رفتار، dontDetectOcamlConflicts را روی true قرار دهید.