فا نیکسی

کمک‌رسان‌های ساخت ساده

Nixpkgs توابع پوششی متنوعی ارائه می‌دهد که به ساخت درایویشن‌های کاربردیِ رایج کمک می‌کنند. مانند stdenv.mkDerivation، هر یک از این کمک‌رسان‌های ساخت یک درایویشن ایجاد می‌کنند، اما آرگومان‌های ارسال‌شده متفاوت (معمولاً ساده‌تر) از آرگومان‌های مورد نیاز stdenv.mkDerivation هستند.

runCommandWith

تابع runCommandWith یک درایویشن ساخته‌شده با استفاده از دستور(های) مشخص‌شده در یک محیط تعیین‌شده را بازمی‌گرداند.

این تابع، تابع پایه و زیرین تمام گونه‌های runCommand* است. رفتار کلی آن از طریق یک مجموعه ویژگی که به عنوان آرگومان اول پاس داده می‌شود کنترل شده و اجازه می‌دهد stdenv به صورت آزادانه تعیین شود.

گونه‌های runCommand* زیر وجود دارند: runCommand، runCommandCC و runCommandLocal.

نوع

runCommandWith :: {
  name :: name;
  stdenv? :: Derivation;
  runLocal? :: Bool;
  derivationArgs? :: { ... };
} -> String -> Derivation

ورودی‌ها

name (رشته) : نام درایویشن، که Nix آن را به مسیر انبار (store path) الحاق خواهد کرد؛ بخش mkDerivation را ببینید.

runLocal (بولین) : اگر روی true تنظیم شود، این گزینه درایویشن را مجبور می‌کند که به‌صورت محلی ساخته شود و از جایگزین‌ها یا ساخت‌های راه دور استفاده نکند. این ویژگی برای دستورات بسیار کم‌هزینه (زمان اجرای کمتر از ۱ ثانیه) در نظر گرفته شده است که می‌توان با اجتناب از رفت‌وبرگشت(های) شبکه سرعت اجرای آن‌ها را افزایش داد. تأثیر آن تنظیم preferLocalBuild = true و allowSubstitutes = false است.

نکته

این کار مانع استفاده از جایگزین‌کننده‌ها می‌شود، بنابراین تنها زمانی runLocal را تنظیم کنید (یا از runCommandLocal استفاده کنید) که اطمینان دارید کاربر همواره یک سازنده (Builder) برای system درایویشن خواهد داشت. این موضوع باید برای بیشتر موارد استفاده ساده صادق باشد (به عنوان مثال، فقط کپی کردن برخی فایل‌ها به یک مکان دیگر یا افزودن پیوندهای نمادین (symlinks))، زیرا در آنجا system معمولاً همان builtins.currentSystem است.

stdenv (درایویشن) : محیط استاندارد برای استفاده، که مقدار پیش‌فرض آن pkgs.stdenv است.

derivationArgs (مجموعه ویژگی) : آرگومان‌های اضافی برای mkDerivation.

buildCommand (رشته) : دستورات شل برای اجرا در سازنده (Builder) درایویشن.

نکته

شما باید یک فایل یا پوشه به نام $out ایجاد کنید تا Nix بتواند سازنده (Builder) را با موفقیت اجرا کند.

> > > **مثال** > > # فراخوانی `runCommandWith` >
runCommandWith
  {
    name = "example";
    derivationArgs.nativeBuildInputs = [ cowsay ];
  }
  ''
    cowsay > $out <<EOMOO
    'runCommandWith' is a bit cumbersome,
    so we have more ergonomic wrappers.
    EOMOO
  ''

runCommand و runCommandCC

تابع runCommand یک derivation / اشتقاق ساخت را برمی‌گرداند که با استفاده از دستور(های) مشخص‌شده، در محیط stdenvNoCC ساخته شده است.

runCommandCC مشابه است، اما از محیط کامپایلر پیش‌فرض استفاده می‌کند. برای به حداقل رساندن وابستگی‌ها، runCommandCC تنها باید زمانی استفاده شود که دستور ساخت به یک کامپایلر C نیاز دارد.

runCommandLocal نیز مشابه runCommand است، اما derivation / اشتقاق ساخت را مجبور می‌کند که به‌صورت محلی ساخته شود. یادداشت در مورد runLocal را در runCommandWith ببینید.

نوع

runCommand      :: String -> AttrSet -> String -> Derivation
runCommandCC    :: String -> AttrSet -> String -> Derivation
runCommandLocal :: String -> AttrSet -> String -> Derivation

ورودی

اگرچه امضای نوع با runCommandWith تفاوت دارد، آرگومان‌های مجزا با نام یکسان، دارای نوع و معنی یکسانی خواهند بود:

name (رشته) : نام derivation

derivationArgs (مجموعه ویژگی) : پارامترهای اضافی پاس‌داده‌شده به [mkDerivation]

buildCommand (رشته) : دستور(هایی) که برای ساخت derivation اجرا می‌شوند.

> > > **مثال** > > # فراخوانی `runCommand` >
runCommand "my-example" { } ''
  echo My example command is running

  mkdir $out

  echo I can write data to the Nix store > $out/message

  echo I can also run basic commands like:

  echo ls
  ls

  echo whoami
  whoami

  echo date
  date
''

نکته

runCommand name derivationArgs buildCommand معادل است با

runCommandWith {
  inherit name derivationArgs;
  stdenv = stdenvNoCC;
} buildCommand

به همین ترتیب، runCommandCC name derivationArgs buildCommand معادل است با

runCommandWith { inherit name derivationArgs; } buildCommand

نوشتن فایل‌های متنی

Nixpkgs توابع زیر را برای تولید درایویشن‌هایی که فایل‌های متنی یا اسکریپت‌های قابل اجرا را در انبار نیکس (Nix store) می‌نویسند، ارائه می‌دهد. این توابع برای ایجاد فایل‌ها از عبارت‌های Nix مفید هستند و همگی به عنوان پوشش‌های تسهیل‌کننده در اطراف writeTextFile پیاده‌سازی شده‌اند.

هر یک از این توابع باعث تولید یک درایویشن می‌شوند. وقتی نتیجه‌ی هر یک از این توابع را با درون‌گذاری رشته یا toString به یک رشته تبدیل می‌کنید، به مسیر انبار این درایویشن ارزیابی می‌شود.

نکته

برخی از این توابع، فایل‌های حاصل را درون پوشه‌ای در داخل خروجی درایویشن قرار می‌دهند. اگر نیاز دارید در جای دیگری از یک عبارت نیکس (Nix expression) به فایل‌های حاصل ارجاع دهید، مسیر آن‌ها را به مسیر انبارِ درایویشن الحاق کنید.

برای مثال، اگر مقصد فایل یک پوشه باشد:

{
  my-file = writeTextFile {
    name = "my-file";
    text = ''
      Contents of File
    '';
    destination = "/share/my-file";
  };
}

به یاد داشته باشید که هنگام استفاده از آن در جاهای دیگر، "/share/my-file" را به مسیر انبار حاصل اضافه کنید:

writeShellScript "evaluate-my-file.sh" ''
  cat ${my-file}/share/my-file
''

makeDesktopItem

یک فایل دسکتاپ XDG را در انبار نیکس (Nix store) می‌نویسد.

این تابع معمولاً برای افزودن آیتم‌های دسکتاپ به یک بسته از طریق قلاب copyDesktopItems استفاده می‌شود.

makeDesktopItem از نسخه 1.4 مشخصات پیروی می‌کند.

ورودی‌ها

makeDesktopItem یک مجموعه ویژگی دریافت می‌کند که بیشتر مقادیر موجود در مشخصات XDG را می‌پذیرد.

تمام کلیدهای شناخته‌شده از مشخصات به استثنای فیلد "Hidden" پشتیبانی می‌شوند. کلیدها به قالب camelCase تبدیل می‌شوند، اما تناظر ۱:۱ با معادل خود در مشخصات دارند: genericName، noDisplay، comment، icon، onlyShowIn، notShowIn، dbusActivatable، tryExec، exec، path، terminal، mimeTypes، categories، implements، keywords، startupNotify، startupWMClass، url، prefersNonDefaultGPU.

فیلد "Version" به صورت هاردکدشده روی نسخه‌ای قرار دارد که makeDesktopItem در حال حاضر از آن پیروی می‌کند.

فیلدهای زیر یا ضروری هستند، یا نوع آن‌ها با مشخصات متفاوت است، یا دارای مقادیر پیش‌فرض خاصی هستند، یا فیلدهای اضافی پشتیبانی‌شده توسط makeDesktopItem هستند:

name (رشته)

: نام فایل دسکتاپ در انبار نیکس (Nix store).

type (رشته؛ اختیاری)

: مقدار پیش‌فرض: "Application"

desktopName (رشته)

: معادل فیلد "Name" در مشخصات است.

actions (لیستی از مجموعه‌های ویژگی؛ اختیاری)

: لیستی از مجموعه‌های ویژگی {'{'}name, exec?, icon?{'}'}

extraConfig (مجموعه ویژگی؛ اختیاری)

: جفت‌های کلید/مقدار اضافی که عیناً به فایل دسکتاپ اضافه می‌شوند. ویژگی‌ها باید دارای پیشوند 'X-' باشند.

مثال‌ها

> > > **مثال** > > # کاربرد ۱ `makeDesktopItem` > > یک فایل دسکتاپ `/nix/store/<store path>/my-program.desktop` را در انبار نیکس (Nix store) می‌نویسد. >
{ makeDesktopItem }:
makeDesktopItem {
  name = "my-program";
  desktopName = "My Program";
  genericName = "Video Player";
  noDisplay = false;
  comment = "Cool video player";
  icon = "/path/to/icon";
  onlyShowIn = [ "KDE" ];
  dbusActivatable = true;
  tryExec = "my-program";
  exec = "my-program --someflag";
  path = "/some/working/path";
  terminal = false;
  actions.example = {
    name = "New Window";
    exec = "my-program --new-window";
    icon = "/some/icon";
  };
  mimeTypes = [ "video/mp4" ];
  categories = [ "Utility" ];
  implements = [ "org.my-program" ];
  keywords = [
    "Video"
    "Player"
  ];
  startupNotify = false;
  startupWMClass = "MyProgram";
  prefersNonDefaultGPU = false;
  extraConfig.X-SomeExtension = "somevalue";
}
> > > **مثال** > > # کاربرد ۲ `makeDesktopItem` > > بسته `hello` را جهت افزودن یک آیتم دسکتاپ بازنشانی کنید. >
{
  copyDesktopItems,
  hello,
  makeDesktopItem,
}:

hello.overrideAttrs {
  nativeBuildInputs = [ copyDesktopItems ];

  desktopItems = [
    (makeDesktopItem {
      name = "hello";
      desktopName = "Hello";
      exec = "hello";
    })
  ];
}

writeTextFile

یک فایل متنی را در انبار نیکس (Nix store) می‌نویسد.

writeTextFile یک مجموعه ویژگی با ویژگی‌های ممکن زیر را می‌پذیرد:

name (String)

: با نام استفاده‌شده در شناسه مسیر انبار نیکس (Nix store) مطابقت دارد.

text (String)

: محتوای فایل.

executable (Bool, اختیاری)

: بیت قابل اجرا (executable) را برای این فایل تنظیم می‌کند.

پیش‌فرض: false

destination (String, اختیاری)

: یک زیرمسیر تحت مسیر خروجی derivation که فایل در آن قرار می‌گیرد. زیرپوشه‌ها هنگام تحقق (realise) derivation به طور خودکار ایجاد می‌شوند.

به طور پیش‌فرض، خود مسیر انبار فایلی حاوی محتوای متنی خواهد بود.

پیش‌فرض: ""

checkPhase (String, اختیاری)

: دستوراتی که باید پس از تولید فایل اجرا شوند.

پیش‌فرض: ""

meta (Attribute set, اختیاری)

: متادیتای اضافی برای derivation.

پیش‌فرض: {'{'}'{'{'}'{'}'}{'{'}'{'}'}'{'}'}

allowSubstitutes (Bool, اختیاری)

: آیا جایگزینی از یک کش باینری مجاز باشد یا خیر. به allowSubstitutes در فراخوانی زیرین derivation منتقل می‌شود.

مقدار پیش‌فرض آن false است، زیرا فرض می‌شود اجرای فایل قابل اجرای ساده‌ی builder مربوط به derivation به صورت محلی سریع‌تر از عملیات شبکه‌ای است. اگر گام checkPhase سنگین است، آن را برابر true قرار دهید.

پیش‌فرض: false

preferLocalBuild (Bool, اختیاری)

: آیا ساخت به صورت محلی ترجیح داده شود، حتی اگر ماشین‌های ساخت راه دور سریع‌تری در دسترس باشند.

به preferLocalBuild در فراخوانی زیرین derivation منتقل می‌شود.

مقدار پیش‌فرض آن به همان دلیلی که allowSubstitutes به طور پیش‌فرض false است، برابر true می‌باشد.

پیش‌فرض: true

derivationArgs (Attribute set, اختیاری)

: آرگومان‌های اضافی برای ارسال به فراخوانی زیرین stdenv.mkDerivation.

پیش‌فرض: {'{'}'{'{'}'{'}'}{'{'}'{'}'}'{'}'}

مسیر انبار حاصل شامل تغییراتی از نام خواهد بود و یک فایل است، مگر اینکه از destination استفاده شده باشد که در آن صورت یک پوشه خواهد بود.

> > > **مثال** > > # کاربرد ۱ از `writeTextFile` > > نوشتن `my-file` در `/nix/store/<store path>/some/subpath/my-cool-script` و قابل اجرا کردن آن. > همچنین اجرای یک بررسی روی فایل حاصل در یک `checkPhase` و ارائه مقادیر برای گزینه‌های کم‌کاربردتر. >
writeTextFile {
  name = "my-cool-script";
  text = ''
    #!/bin/sh
    echo "This is my cool script!"
  '';
  executable = true;
  destination = "/some/subpath/my-cool-script";
  checkPhase = ''
    ${pkgs.shellcheck}/bin/shellcheck $out/some/subpath/my-cool-script
  '';
  meta = {
    license = pkgs.lib.licenses.cc0;
  };
  allowSubstitutes = true;
  preferLocalBuild = false;
}
> > > **مثال** > > # کاربرد ۲ `writeTextFile` > > رشتهٔ `Contents of File` را در `/nix/store/<store path>` بنویسید. > همچنین تابع کمکی [](#trivial-builder-writeText) را ببینید. >
writeTextFile {
  name = "my-file";
  text = ''
    Contents of File
  '';
}
> > > **مثال** > > # کاربرد ۳ `writeTextFile` > > یک اسکریپت قابل اجرای `my-script` را در `/nix/store/<store path>/bin/my-script` می‌نویسد. > همچنین تابع کمک‌رسان [](#trivial-builder-writeScriptBin) را ببینید. >
writeTextFile {
  name = "my-script";
  text = ''
    echo "hi"
  '';
  executable = true;
  destination = "/bin/my-script";
}

writeText

نوشتن یک فایل متنی در انبار Nix

writeText آرگومان‌های زیر را می‌گیرد:

name (String)

: نامی که در مسیر انبار Nix استفاده می‌شود.

text (String)

: محتوای فایل.

مسیر انبار شامل این نام خواهد بود و یک فایل خواهد بود.

> > > **مثال** > > # استفاده از `writeText` > > نوشتن رشته `Contents of File` در `/nix/store/<store path>`: >
writeText "my-file" ''
  Contents of File
''

این معادل است با:

writeTextFile {
  name = "my-file";
  text = ''
    Contents of File
  '';
}

writeTextDir

نوشتن یک فایل متنی درون یک زیرپوشه از انبار نیکس (Nix store).

writeTextDir آرگومان‌های زیر را می‌پذیرد:

path (رشته)

: مقصد در مسیر انبار نیکس (Nix store) که فایل باید زیر آن ایجاد شود.

text (رشته)

: محتویات فایل.

مسیر انبار یک پوشه خواهد بود.

> > > **مثال** > > # استفاده از `writeTextDir` > > نوشتن رشته `Contents of File` در `/nix/store/<store path>/share/my-file`: >
writeTextDir "share/my-file" ''
  Contents of File
''

این معادل است با:

writeTextFile {
  name = "my-file";
  text = ''
    Contents of File
  '';
  destination = "/share/my-file";
}

writeScript

یک فایل اسکریپت قابل اجرا را در انبار نیکس (Nix store) می‌نویسد.

writeScript آرگومان‌های زیر را می‌پذیرد:

name (رشته)

: نامی که در مسیر انبار نیکس (Nix store) استفاده می‌شود.

text (رشته)

: محتوای فایل.

فایل ایجادشده به عنوان قابل اجرا علامت‌گذاری می‌شود. مسیر انبار شامل نام خواهد بود و یک فایل خواهد بود.

> > > **مثال** > > # استفاده از `writeScript` > > رشته `Contents of File` را در `/nix/store/<store path>` بنویسید و فایل را قابل اجرا کنید. >
writeScript "my-file" ''
  Contents of File
''

این معادل است با:

writeTextFile {
  name = "my-file";
  text = ''
    Contents of File
  '';
  executable = true;
}

writeScriptBin

اسکریپتی را درون یک زیرپوشه bin از پوشه‌ای در انبار نیکس (Nix store) می‌نویسد. این کار جهت حفظ سازگاری با عرف بسته‌های نرم‌افزاری در قرار دادن فایل‌های اجرایی در زیرپوشه bin انجام می‌شود.

writeScriptBin آرگومان‌های زیر را می‌پذیرد:

name (String)

: نام مورد استفاده در مسیر انبار نیکس (Nix store) و درون فایل ایجادشده زیر مسیر انبار.

text (String)

: محتوای فایل.

فایل ایجادشده به عنوان قابل اجرا نشانه‌گذاری می‌شود. محتوای فایل در مسیر /nix/store/<store path>/bin/<name> قرار خواهد گرفت. مسیر انبار شامل نام خواهد بود و یک پوشه خواهد بود.

> > > **مثال** > > # استفاده از `writeScriptBin` >
writeScriptBin "my-script" ''
  echo "hi"
''

این معادل است با:

writeTextFile {
  name = "my-script";
  text = ''
    echo "hi"
  '';
  executable = true;
  destination = "/bin/my-script";
}

writeShellScript

یک اسکریپت Bash را در انبار می‌نویسد.

writeShellScript آرگومان‌های زیر را می‌پذیرد:

name (String)

: نامی که در مسیر انبار نیکس (Nix store) استفاده می‌شود.

text (String)

: محتوای فایل.

فایل ایجادشده به‌صورت قابل اجرا نشانه‌گذاری می‌شود. مسیر انبار شامل این نام خواهد بود و یک فایل خواهد بود.

این تابع تقریباً کاملاً مشابه است، با این تفاوت که یک سطر شبانگ (shebang) به ابتدای فایل اضافه می‌کند که به نسخه Bash مورد استفاده در Nixpkgs اشاره دارد.

> > > **مثال** > > # نحوه استفاده از `writeShellScript` >
writeShellScript "my-script" ''
  echo "hi"
''

این معادل است با:

writeTextFile {
  name = "my-script";
  text = ''
    #! ${pkgs.runtimeShell}
    echo "hi"
  '';
  executable = true;
}

writeShellScriptBin

نوشتن یک اسکریپت Bash در زیرپوشه "bin" مربوط به یک پوشه در انبار نیکس (Nix store).

writeShellScriptBin آرگومان‌های زیر را می‌گیرد:

name (رشته)

: نام استفاده‌شده در مسیر انبار نیکس (Nix store) و درون فایل تولیدشده زیر مسیر انبار.

text (رشته)

: محتویات فایل.

محتویات فایل در /nix/store/<store path>/bin/<name> قرار می‌گیرد. مسیر انبار شامل نام خواهد بود و یک پوشه است.

این تابع ترکیبی از و است.

> > > **مثال** > > # نحوه استفاده از `writeShellScriptBin` >
writeShellScriptBin "my-script" ''
  echo "hi"
''

این معادل است با:

writeTextFile {
  name = "my-script";
  text = ''
    #! ${pkgs.runtimeShell}
    echo "hi"
  '';
  executable = true;
  destination = "/bin/my-script";
}

concatTextFile، concatText، concatScript

این توابع، files را در قالب یک فایل واحد در انبار نیکس (Nix store) به یکدیگر متصل می‌کنند. این ویژگی برای فایل‌های پیکربندی که به صورت خطوط متنی ساختار یافته‌اند مفید است. concatTextFile یک مجموعه ویژگی دریافت می‌کند و انتظار دو آرگومان دارد: name و files. name متناظر با نام استفاده‌شده در مسیر انبار نیکس (Nix store) است. files شامل فایل‌هایی خواهد بود که قرار است به هم متصل شوند. همچنین می‌توانید executable را برابر با true قرار دهید تا بیت قابل اجرا برای این فایل تنظیم شود. concatText و concatScript روکش‌های (wrapper) ساده‌ای روی concatTextFile هستند.

در ادامه چند نمونه آورده شده است:

# Writes my-file to /nix/store/<store path>
concatTextFile
  {
    name = "my-file";
    files = [
      drv1
      "${drv2}/path/to/file"
    ];
  }
  # See also the `concatText` helper function below.

  # Writes executable my-file to /nix/store/<store path>/bin/my-file
  concatTextFile
  {
    name = "my-file";
    files = [
      drv1
      "${drv2}/path/to/file"
    ];
    executable = true;
    destination = "/bin/my-file";
  }
  # Writes contents of files to /nix/store/<store path>
  concatText
  "my-file"
  [
    file1
    file2
  ]

  # Writes contents of files to /nix/store/<store path>
  concatScript
  "my-file"
  [
    file1
    file2
  ]

writeShellApplication

writeShellApplication شبیه به writeShellScriptBin و writeScriptBin است، اما از وابستگی‌های زمان اجرا با runtimeInputs پشتیبانی می‌کند. یک اسکریپت شل قابل اجرا را در /nix/store/<store path>/bin/<name> می‌نویسد و نحو آن را با shellcheck و گزینه -n در bash بررسی می‌کند. برخی از گزینه‌های پایه Bash به طور پیش‌فرض تنظیم شده‌اند (errexit ،nounset و pipefail)، اما می‌توان آن‌ها را با bashOptions بازنشانی کرد.

آرگومان‌های اضافی را می‌توان با تنظیم derivationArgs به stdenv.mkDerivation ارسال کرد؛ توجه داشته باشید متغیرهایی که به این روش تنظیم می‌شوند، هنگام ساخت اسکریپت شل مقداردهی می‌شوند، نه زمان اجرای آن. متغیرهای محیطی زمان اجرا را می‌توان با آرگومان runtimeEnv تنظیم کرد.

writeShellApplication دارای آرگومان‌های زیر است:

name (String)

: نام اسکریپتی که باید نوشته شود.

text (String)

: متن اسکریپت شل، بدون شامل شدن shebang.

runtimeInputs (لیستی از درایویشن‌ها یا رشته‌ها، اختیاری)

: ورودی‌هایی که باید در زمان اجرا به $PATH اسکریپت شل اضافه شوند.

هر عنصر می‌تواند یک derivation معمولی یا یک رشته شامل یک مسیر باشد که در این صورت پسوند /bin به آن اضافه می‌شود تا یک عبارت PATH ایجاد کند (برای اطلاعات بیشتر به lib.strings.makeBinPath مراجعه کنید).

runtimeEnv (مجموعه ویژگی، اختیاری)

: متغیرهای محیطی اضافی برای تنظیم در زمان اجرا.

checkPhase (رشته، اختیاری)

: checkPhase برای اجرا.

مسیر اسکریپت به عنوان $target در checkPhase ارائه می‌شود.

رفتار پیش‌فرض: اجرای shellcheck (روی پلتفرم‌های پشتیبانی‌شده) و bash -n (بررسی نحو بدون اجرای دستورات).

excludeShellChecks (لیستی از رشته‌ها، اختیاری)

: بررسی‌هایی که باید هنگام اجرای shellcheck مستثنی شوند.

به عنوان مثال، excludeShellChecks = [ "SC2016" ] مانع از گزارش SC2016 توسط shellcheck می‌شود، اما همچنان هرگونه مشکل دیگر را تشخیص می‌دهد.

برای مشاهده لیست بررسی‌ها به ویکی shellcheck مراجعه کنید.

extraShellCheckFlags (لیستی از رشته‌ها، اختیاری)

: پرچم‌های خط فرمان اضافی برای ارسال به shellcheck.

bashOptions (لیستی از رشته‌ها، اختیاری)

: گزینه‌های Bash برای فعال‌سازی با set -o در شروع اسکریپت.

پیش‌فرض: [ "errexit" "nounset" "pipefail" ] که به این معناست:

  1. شکست یک دستور در داخل لیست دستورات یا پایپ‌لاین باعث خروج اسکریپت می‌شود، مگر اینکه به عنوان یک شرط استفاده شده باشد (در داخل while ،if ،&& ،|| و غیره)؛
  2. هرگونه تلاش برای گسترش یک متغیر تعریف‌نشده باعث خروج اسکریپت می‌شود.

inheritPath (بولی، اختیاری)

: آیا اسکریپت PATH را از محیط والد خود به ارث می‌برد یا خیر.

پیش‌فرض: true

meta (مجموعه ویژگی، اختیاری)

: آرگومان meta مربوط به stdenv.mkDerivation

passthru (مجموعه ویژگی، اختیاری)

: آرگومان passthru مربوط به stdenv.mkDerivation

derivationArgs (مجموعه ویژگی، اختیاری)

: آرگومان‌های اضافی برای ارسال به stdenv.mkDerivation

احتیاط

برخی صفات derivation نیز به صورت داخلی تنظیم می‌شوند، بنابراین بازنشانی آن‌ها می‌تواند باعث بروز مشکلاتی شود.

> > > **مثال** > > # نحوه استفاده از `writeShellApplication` > > برنامه شل زیر می‌تواند مستقیماً به `curl` ارجاع دهد، به جای اینکه نیاز باشد `${'{'}curl{'}'}/bin/curl` نوشته شود >
writeShellApplication {
  name = "show-nixos-org";

  runtimeInputs = [
    curl
    w3m
  ];

  text = ''
    curl -s 'https://nixos.org' | w3m -dump -T text/html
  '';
}

symlinkJoin

از این تابع می‌توان برای قرار دادن چندین درایویشن در یک ساختار پوشه یکسان استفاده کرد. نحوه کار آن به این صورت است که یک درایویشن جدید ایجاد کرده و پیوندهای نمادین (symlinks) را به هر یک از مسیرهای فهرست‌شده اضافه می‌کند. این تابع دو آرگومان دریافت می‌کند: name و paths. صفت name (یا به عنوان جایگزین، pname و version) نامی است که در مسیر انبار نیکس (Nix store) برای درایویشن ایجادشده استفاده می‌شود. paths فهرستی از مسیرها است که پیوند نمادین (symlink) داده خواهند شد. این مسیرها می‌توانند به درایویشن‌های انبار نیکس (Nix store) یا هر زیرپوشهٔ موجود در آن‌ها اشاره داشته باشند. در ادامه یک نمونه آورده شده است:

# adds symlinks of hello and stack to current build and prints "links added"
symlinkJoin {
  name = "myexample";
  paths = [
    pkgs.hello
    pkgs.stack
  ];
  postBuild = "echo links added";
}

این یک درایویشن با ساختار پوشه‌ای مانند زیر ایجاد می‌کند:

/nix/store/sglsr5g079a5235hy29da3mq3hv8sjmm-myexample
|-- bin
|   |-- hello -> /nix/store/qy93dp4a3rqyn2mz63fbxjg228hffwyw-hello-2.10/bin/hello
|   `-- stack -> /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/bin/stack
`-- share
    |-- bash-completion
    |   `-- completions
    |       `-- stack -> /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/share/bash-completion/completions/stack
    |-- fish
    |   `-- vendor_completions.d
    |       `-- stack.fish -> /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/share/fish/vendor_completions.d/stack.fish
...

writeClosure

با گرفتن فهرستی از مسیرهای انبار (یا عبارت‌های رشته‌مانند قابل تبدیل به مسیرهای انبار)، بستار جمعی آن‌ها را در یک فایل متنی می‌نویسد.

نتیجه معادل خروجی nix-store -q --requisites است.

برای نمونه،

writeClosure [ (writeScriptBin "hi" "${hello}/bin/hello") ]

مسیر خروجی /nix/store/<hash>-runtime-deps را تولید می‌کند که شامل

/nix/store/<hash>-hello-2.10
/nix/store/<hash>-hi
/nix/store/<hash>-libidn2-2.3.0
/nix/store/<hash>-libunistring-0.9.10
/nix/store/<hash>-glibc-2.32-40

می‌توانید ببینید که این شامل hi (مسیر ورودی اصلی)، hello که یک ارجاع مستقیم است، و همچنین مسیرهای دیگری است که به‌طور غیرمستقیم برای اجرای hello مورد نیاز هستند.

writeDirectReferencesToFile

مجموعه‌ی ارجاعات، یعنی وابستگی‌های مستقیم آن‌ها را در فایل خروجی می‌نویسد.

این خروجی معادل nix-store -q --references تولید می‌کند.

برای مثال،

writeDirectReferencesToFile (writeScriptBin "hi" "${hello}/bin/hello")

مسیر خروجی /nix/store/<hash>-runtime-references را تولید می‌کند که حاوی

/nix/store/<hash>-hello-2.10

اما هیچ‌یک از وابستگی‌های hello، زیرا آن‌ها به‌طور مستقیم توسط خروجی hi مورد ارجاع قرار نگرفته‌اند.