فا نیکسی

یک ماژول ساده

ماژول چیست؟

  • یک ماژول تابعی است که یک مجموعه ویژگی را دریافت کرده و یک مجموعه ویژگی بازمی‌گرداند.
  • ممکن است گزینه‌هایی را اعلام کند و مشخص نماید چه صفاتی در خروجی نهایی مجاز هستند.
  • ممکن است مقادیری را برای گزینه‌های اعلام‌شده توسط خودش یا سایر ماژول‌ها تعریف کند.
  • هنگامی که توسط سیستم ماژول ارزیابی می‌شود، بر اساس اعلام‌ها و تعاریف، یک مجموعه ویژگی تولید می‌کند.

ساده‌ترین ماژول ممکن تابعی است که هر ویژگی را دریافت کرده و یک مجموعه ویژگی خالی بازمی‌گرداند:

options.nix

{ ... }:
{
}

برای تعریف هر مقداری، سیستم ماژول ابتدا باید بداند چه مقداری مجاز است. این کار با اعلام گزینه‌ها (options) انجام می‌شود که مشخص می‌کنند کدام صفت‌ها (attributes) می‌توانند تنظیم شده و در جای دیگری استفاده شوند.

اعلام گزینه‌ها

گزینه‌ها تحت صفت سطح بالای options با استفاده از lib.mkOption اعلام می‌شوند.

options.nix

{ lib, ... }:
{
  options = {
    name = lib.mkOption { type = lib.types.str; };
  };
}

نکته

آرگومان lib به طور خودکار توسط سیستم ماژول پاس داده می‌شود. این کار تابع‌های کتابخانه‌ای Nixpkgs را در بدنهٔ تابع هر ماژول در دسترس قرار می‌دهد.

نقطهچین ... ضروری است زیرا سیستم ماژول می‌تواند آرگومان‌های دلخواهی را به ماژول‌ها پاس دهد.

صفت type در آرگومان ارائه‌شده به lib.mkOption مشخص می‌کند که چه مقادیری برای یک گزینه معتبر هستند. انواع مختلفی تحت lib.types در دسترس هستند.

در اینجا یک گزینهٔ name از نوع str را اعلام کرده‌ایم: سیستم ماژول هنگامی که مقداری تعریف شود، انتظار یک رشته را خواهد داشت.

اکنون که یک گزینه را اعلام کرده‌ایم، به طور طبیعی می‌خواهیم مقداری به آن اختصاص دهیم.

تعریف مقادیر

گزینه‌ها تحت صفت سطح بالا config تنظیم یا تعریف می‌شوند:

config.nix

{ ... }:
{
  config = {
    name = "Boaty McBoatface";
  };
}

در اعلام گزینهٔ خود، گزینه‌ای به نام name با نوع رشته ایجاد کردیم. در اینجا، در تعریف گزینهٔ خود، همان گزینه را روی یک رشته تنظیم کرده‌ایم.

اعلام‌های گزینه و تعریف‌های گزینه نیازی نیست که در یک فایل باشند. اینکه کدام ماژول‌ها در مجموعه ویژگی نهایی مشارکت دارند، هنگام راه‌اندازی ارزیابی سیستم ماژول مشخص می‌شود.

ارزیابی ماژول‌ها

ماژول‌ها توسط lib.evalModules از کتابخانهٔ Nixpkgs ارزیابی می‌شوند. این تابع یک مجموعه ویژگی را به عنوان آرگومان می‌پذیرد که در آن صفت modules فهرستی از ماژول‌ها برای ادغام و ارزیابی است.

خروجی evalModules شامل اطلاعاتی دربارهٔ تمام ماژول‌های ارزیابی‌شده است و مقادیر نهایی در صفت config ظاهر می‌شوند.

default.nix

let
  pkgs = import <nixpkgs> { };
  result = pkgs.lib.evalModules {
    modules = [
      ./options.nix
      ./config.nix
    ];
  };
in
result.config

در اینجا یک اسکریپت کمکی برای تجزیه و ارزیابی فایل default.nix خود با nix-instantiate --eval و چاپ خروجی به صورت JSON آورده شده است:

eval.bash

nix-shell -p jq --run "nix-instantiate --eval --json --strict | jq"

تا زمانی که هر تعریف دارای یک اعلامیهٔ متناظر باشد، ارزیابی با موفقیت انجام خواهد شد. اگر تعریف گزینه‌ای وجود داشته باشد که اعلام نشده باشد، یا مقدار تعریف‌شده دارای نوع اشتباهی باشد، سیستم ماژول خطایی پرتاب خواهد کرد.

اجرای اسکریپت (./eval.bash) باید خروجی‌ای را نشان دهد که با آنچه پیکربندی کرده‌ایم مطابقت دارد:

{
  "name": "Boaty McBoatface"
}

nix.dev/tutorials/module-system/a-basic-module

نیکسی · یادداشت‌های فارسی Nix local fonts