5.4.1. Derivationها
مهمترین تابع توکار، derivation است که برای توصیف یک store derivation در سطح انبار استفاده میشود.
برای اطلاع از ماهیت یک store derivation، به فصل انبار مراجعه کنید؛
این بخش صرفاً به نحوه ایجاد آن از طریق زبان Nix میپردازد.
این تابع توکار یک مجموعه ویژگی به عنوان ورودی دریافت میکند که ویژگیهای آن مشخصکننده ورودیهای فرآیند هستند. این تابع یک مجموعه ویژگی خروجی میدهد و به عنوان اثر جانبی ارزیابی، یک store derivation تولید میکند.
ویژگیهای ورودی
الزامی
[
name] (String)یک نام نمادین برای derivation. برای اینکه ببینید این نام روی چه چیزی تأثیر میگذارد، به خروجیهای derivation مراجعه کنید.
مثال
derivation { name = "hello"; # ... }مسیر derivation برابر با
/nix/store/<hash>-hello.drvخواهد بود. مسیرهای output به شکل/nix/store/<hash>-hello[-<output>]خواهند بود.
derivation { # ... system = "x86_64-linux"; # ... }
مثال
یک derivation را اعلام کنید تا روی نوع سیستمی که عبارت را ارزیابی میکند ساخته شود:
derivation { # ... system = builtins.currentSystem; # ... }
builtins.currentSystemدارای مقدار [systemconfiguration option] است و به طور پیشفرض روی نوع سیستم نصب فعلی Nix تنظیم میشود.
-
بخش builder را ببینید.
مثال
از فایل واقع در مسیر
/bin/bashبه عنوان فایل اجرایی سازنده (Builder) استفاده کنید:
derivation { # ... builder = "/bin/bash"; # ... };
مثال
کپی کردن یک فایل محلی به انبار نیکس برای استفاده به عنوان فایل اجرایی سازنده (builder):
derivation { # ... builder = ./builder.sh; # ... };
مثال
از یک فایل متعلق به درایویشن دیگری بهعنوان فایل اجرایی سازنده (builder) استفاده کنید:
let pkgs = import <nixpkgs> {}; in derivation { # ... builder = "${pkgs.python}/bin/python"; # ... };
اختیاری
-
پیشفرض:
[ ]به args مراجعه کنید.
مثال
ارسال آرگومانها به Bash برای تفسیر یک فرمان شل:
derivation { # ... builder = "/bin/bash"; args = [ "-c" "echo hello world > $out" ]; # ... };
-
پیشفرض:
[ "out" ]خروجیهای نمادین درایویشن. نام هر خروجی به عنوان یک متغیر محیطی به فایل اجرایی
builderارسال میشود که مقدار آن روی [مسیر انبار] مربوطه تنظیم شده است.به طور پیشفرض، یک درایویشن یک خروجی واحد به نام
outتولید میکند. با این حال، درایویشنها میتوانند چندین خروجی تولید کنند. این امر به [اشیاء انبار] (store objects) مرتبط و بستارهای آنها اجازه میدهد تا به صورت جداگانه کپی یا جمعآوری زباله (garbage collection) شوند.مثال
یک بسته کتابخانه را تصور کنید که یک کتابخانه پویا، فایلهای هدر و مستندات را فراهم میکند. برنامهای که به چنین کتابخانهای لینک میشود، در زمان اجرا نیازی به فایلهای هدر و مستندات ندارد و در زمان ساخت نیز نیازی به مستندات ندارد. بنابراین، بسته کتابخانه میتواند موارد زیر را مشخص کند:
derivation { # ... outputs = [ "lib" "dev" "doc" ]; # ... }این کار باعث میشود Nix متغیرهای محیطی
lib،devوdocرا که حاوی مسیرهای انبار موردنظر برای هر خروجی هستند، به سازنده (Builder) ارسال کند. سازنده (Builder) معمولاً کاری شبیه به این انجام خواهد داد:
./configure \ --libdir=$lib/lib \ --includedir=$dev/include \ --docdir=$doc/share/docبرای یک بسته با سبک Autoconf.
نام یک خروجی با نام derivation ترکیب میشود تا بخش نام مربوط به مسیر انبارِ خروجی را ایجاد کند، مگر اینکه out باشد؛ در این صورت، فقط از نام derivation استفاده میشود.
مثال
derivation { name = "example"; outputs = [ "lib" "dev" "doc" "out" ]; # ... }مسیر derivation انبار
/nix/store/<hash>-example.drvخواهد بود. مسیرهای خروجی عبارتند از
/nix/store/<hash>-example-lib/nix/store/<hash>-example-dev/nix/store/<hash>-example-doc/nix/store/<hash>-example
شما میتوانید با انتخاب هر خروجی از یک derivation به عنوان یک صفت (attribute)، به آن ارجاع دهید.
نخستین عنصر outputs، خروجی پیشفرض را تعیین میکند و در نهایت در سطح بالا قرار میگیرد.
مثال
یک خروجی را با نام صفت (attribute) انتخاب کنید:
let myPackage = derivation { name = "example"; outputs = [ "lib" "dev" "doc" "out" ]; # ... }; in myPackage.devاز آنجا که
libاولین خروجی است،myPackageمعادلmyPackage.libاست.
- برای مشاهده صفتهای اختیاری و کمتر استفادهشدهی بیشتر، به صفات پیشرفته مراجعه کنید.
هر صفت دیگری به عنوان یک متغیر محیطی به سازنده منتقل میشود. مقادیر صفتها به شکل زیر به متغیرهای محیطی تبدیل میشوند:
رشتهها بدون تغییر منتقل میشوند.
اعداد صحیح به نماد اعشاری تبدیل میشوند.
اعداد اعشاری با دقت ازپیشتعیینشده به نماد اعشاری ساده یا علمی تبدیل میشوند.
یک مسیر (مثلاً
../foo/sources.tar) باعث میشود که فایل ارجاعدادهشده به انبار کپی شود؛ مکان آن در انبار در متغیر محیطی قرار میگیرد. ایده این است که تمام منابع باید در انبار Nix قرار داشته باشند، زیرا تمام ورودیهای یک derivation باید در انبار Nix سکونت داشته باشند.یک derivation باعث میشود که آن derivation پیش از derivation فعلی ساخته شود. متغیر محیطی روی [مسیر انبار][خروجی](#attr-outputs) پیشفرض آن derivation تنظیم میشود.
فهرستهای انواع قبلی نیز مجاز هستند. آنها به سادگی و با جداکنندهٔ فاصله به یکدیگر متصل میشوند.
مقدار
trueبه عنوان رشتهی1منتقل میشود وfalseوnullبه عنوان یک رشتهی خالی منتقل میشوند.