فا نیکسی

4.4.1. خروجی‌های Derivation و انواع Derivationها

همان‌طور که در صفحات اصلی درایویشن‌ها بیان شد، یک درایویشن اشیاء انبار تولید می‌کند که به عنوان خروجی‌های درایویشن شناخته می‌شوند. در واقع، هدف اصلی درایویشن‌ها تولید همین خروجی‌ها است و اینکه این خروجی‌ها در هر بار اجرای درایویشن، به شکلی قابل‌اعتماد و بازتولیدپذیر تولید شوند.

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

نام‌های خروجی

نام‌های خروجی می‌توانند هر رشته‌ای باشند که همچنین یک نام مسیر انبار معتبر باشد. نامی که به هر مشخصات خروجی نگاشت می‌شود، در واقع خودِ نام خروجی نیست. در حالت کلی، شیء انبار خروجی داراي نام derivationName + "-" + outputSpecName است و هیچ متاداده‌ی دیگری درباره‌ی آن وجود ندارد. با این حال، مشخصات خروجی با نام "out" توصیف‌کننده‌ی یک شیء انبار خروجی است که نام آن صرفاً همان نام درایویشن است.

مثال

یک درایویشن با نام hello دارای دو خروجی out و dev است:

  • مسیر درایویشن به این شکل خواهد بود: /nix/store/<hash>-hello.drv

  • مسیر انبار out به این شکل خواهد بود: /nix/store/<hash>-hello

  • مسیر انبار dev به این شکل خواهد بود: /nix/store/<hash>-hello-dev

خروجی‌های درایویشن‌ها همان اشیاء انبار هستند که درایویشن موظف به تولید آن‌هاست.

نکته

اصطلاحات رسمی در اینجا تا حدی با ارتباطات روزمره در جامعه‌ی کاربری Nix در زمان حال مغایرت دارد. واژه‌ی «خروجی» در کاربرد معمولی، بسته به زمینه، معمولاً به خود شیء انبار خروجی واقعی یا به مشخصات خروجی مفهومی اشاره دارد.

برای مثال، عبارت «خروجی dev متعلق به hello» به شیء انباری اشاره دارد که توسط مسیر انبار /nix/store/<hash>-hello-dev مشخص شده است. نامیدن این مورد به عنوان «خروجی hello-dev» غیرمعمول است، حتی اگر hello-dev نام واقعی آن شیء انبار باشد.

انواع آدرس‌دهی خروجی

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

انواع درایویشن‌ها

بخش‌های مربوط به هر نوع آدرس‌دهی خروجی درایویشن، در نهایت علاوه بر خروجی‌های درایویشن، به بحث درباره‌ی صفت‌های دیگر آن مانند خلوص (purity)، زمان‌بندی (scheduling)، قطعی بودن (determinism) و غیره پرداختند؛ این موضوع تصادفی نیست؛ زیرا نوع یک درایویشن در واقع با نوع خروجی‌های آن تناظر یک‌به‌یک دارد:

  • درایویشنی که خروجی‌های با آدرس xyz تولید می‌کند، یک درایویشن با آدرس‌دهی xyz است.

قوانین مربوط به این موضوع نسبتاً مختصر هستند:

  • تمام خروجی‌ها باید از یک نوع باشند / از یک روش آدرس‌دهی استفاده کنند

    • درایویشن باید حداقل یک خروجی داشته باشد

    • علاوه بر این، اگر خروجی‌ها از نوع محتوا-محور ثابت (fixed content-addressed) باشند، دقیقاً باید یک خروجی وجود داشته باشد که مشخصات آن از نام out نگاشت شده است. (نام out طبق قوانین شرح‌داده‌شده در بالا، خاص است. داشتن تنها یک خروجی و نامیدن مشخصات آن به عنوان out به این معناست که خروجی تکی عملاً بی‌نام است؛ و مسیر انبار صرفاً شامل نام درایویشن است.)

(این یک محدودیت دلخواه است که می‌تواند برداشته شود.)

  • خروجی یا ثابت (fixed) است یا شناور (floating)، که نشان می‌دهد آیا مسیر انبار پیش از ساختن آن مشخص است یا خیر.

    • در آدرس‌دهی محتوایی ثابت، مقدار آن ثابت است.

      یک درایویشن با آدرس‌دهی محتوایی ثابت، درایویشن خروجی-ثابت (fixed-output derivation) نیز نامیده می‌شود، زیرا این تنها شکل پیاده‌سازی‌شده‌ی فعلی از آدرس‌دهی خروجی-ثابت است.

    • با آدرس‌دهی محتوایی شناور یا ورودی-محور، مقدار آن شناور است.

    بنابراین، به طور تاریخی در Nix، بدون فعال بودن هیچ‌گونه ویژگی آزمایشی، تمام خروجی‌ها ثابت هستند.

  • درایویشن ممکن است خالص (pure) یا ناخالص (impure) باشد، که نشان می‌دهد سازنده چه دسترسی خواندنی به دنیای خارج دارد.

    • یک درایویشن ورودی-محور باید خالص باشد.

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

    • یک درایویشن محتوا-محور ممکن است خالص یا ناخالص باشد.

    • اگر ناخالص باشد، ممکن است ثابت باشد (که حالت رایج است)، یا اگر ویژگی آزمایشی impure-derivations فعال باشد، می‌تواند شناور باشد.

    • اگر خالص باشد، باید شناور باشد.

    • درایویشن‌های محتوا-محورِ خالص و ثابت پشتیبانی نمی‌شوند.

      هیچ کاربردی برای این ترکیب چهارم وجود ندارد. تنها هدفِ ثابت بودن مسیر انبارِ یک خروجی، پشتیبانی از ناخالص بودن درایویشن است.

nix.dev/manual/nix/stable/store/derivation/outputs/

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