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فعال باشد، میتواند شناور باشد.اگر خالص باشد، باید شناور باشد.
درایویشنهای محتوا-محورِ خالص و ثابت پشتیبانی نمیشوند.
هیچ کاربردی برای این ترکیب چهارم وجود ندارد. تنها هدفِ ثابت بودن مسیر انبارِ یک خروجی، پشتیبانی از ناخالص بودن درایویشن است.