فا نیکسی

Nim

کامپایلر Nim و یک تابع سازنده در دسترس هستند. برنامه‌های Nim با استفاده از یک فایل lockfile و یکی از توابع buildNimPackage یا buildNimSbom ساخته می‌شوند.

buildNimPackage

مثال زیر برنامه‌ای به زبان Nim را نشان می‌دهد که تنها به کتابخانه‌های Nim وابسته است:

{
  lib,
  buildNimPackage,
  fetchFromGitHub,
}:

buildNimPackage (finalAttrs: {
  pname = "ttop";
  version = "1.2.7";

  src = fetchFromGitHub {
    owner = "inv2004";
    repo = "ttop";
    tag = "v${finalAttrs.version}";
    hash = lib.fakeHash;
  };

  lockFile = ./lock.json;

  nimFlags = [ "-d:NimblePkgVersion=${finalAttrs.version}" ];
})

پارامترهای buildNimPackage

تابع buildNimPackage یک مجموعه ویژگی از پارامترها را دریافت می‌کند که به stdenv.mkDerivation منتقل می‌شوند.

$ cd nixpkgs
$ nix build -f . ttop.src
$ nix run -f . nim_lk ./result | jq --sort-keys > pkgs/by-name/tt/ttop/lock.json

buildNimSbom

یک جایگزین برای buildNimPackage عبارت است از buildNimSbom که بسته‌ها را از فایل‌های [

# pkgs/by-name/ni/nim_lk/package.nix
{
  lib,
  buildNimSbom,
  fetchFromSourcehut,
  openssl,
}:

buildNimSbom (finalAttrs: {
  src = fetchFromSourcehut {
    owner = "~ehmry";
    repo = "nim_lk";
    tag = finalAttrs.version;
    hash = lib.fakeHash;
  };
  buildInputs = [ openssl ];
}) ./sbom.json

تولید SBOMها

ابزار nim_lk می‌تواند از متادیتای بسته‌ی [

pkgs.nitter.overrideNimAttrs {
  # using a different source which has different dependencies from the standard package
  src = pkgs.fetchFromGitHub {
    # …
  };
  # new lock file generated from the source
  lockFile = ./custom-lock.json;
}

بازنشانی‌های وابستگی lockfile

تابع buildNimPackage کتابخانه‌های مشخص‌شده توسط lockFile را با مجموعه ویژگی (

{
  lib,
  # …
  SDL2,
  # …
}:

{
  # …
  sdl2 =
    lockAttrs:
    {
      buildInputs ? [ ],
      ...
    }:
    {
      buildInputs = buildInputs ++ [ SDL2 ];
    };
  # …
}

حاشیه‌نویسی‌ها در مجموعه nim-overrides.nix توابعی هستند که دو آرگومان می‌گیرند و یک attrset جدید برمی‌گردانند تا روی بسته‌ای

{
  lib,
  buildNimPackage,
  nimOverrides,
  libressl,
}:

let
  buildNimPackage' = buildNimPackage.override {
    nimOverrides = nimOverrides.override { openssl = libressl; };
  };
in
buildNimPackage' (finalAttrs: {
  pname = "foo";
  # …
})

بازنشانی یک بسته به صورت خارجی:

{ pkgs }:
{
  foo = pkgs.foo.override {
    buildNimPackage = pkgs.buildNimPackage.override {
      nimOverrides = pkgs.nimOverrides.override { openssl = libressl; };
    };
  };
}