5.4.1.1. صفات پیشرفته
درایویشنها میتوانند برخی از صفات اختیاری که کمتر استفاده میشوند را اعلام کنند.
ورودیها
- [
exportReferencesGraph]\ این صفت به سازندهها اجازه میدهد به گراف ارجاعات ورودیهای خود دسترسی داشته باشند. این صفت فهرستی از ورودیها در انبار Nix است که سازنده باید گراف ارجاعات آنها را بداند. مقدار این صفت باید فهرستی از جفتهای[ name1 path1 name2 path2 ... ]باشد. گراف ارجاعات هر pathN در یک فایل متنی با نام nameN در پوشه ساخت موقت ذخیره خواهد شد. فایلهای متنی دارای قالبی هستند که توسطnix-store --register-validityاستفاده میشود (در حالی که فیلدهای درایور خالی گذاشته شدهاند). برای مثال، وقتی درایویشن زیر ساخته میشود:
derivation {
...
exportReferencesGraph = [ "libfoo-graph" libfoo ];
}; گراف ارجاعات libfoo در فایل libfoo-graph در پوشه ساخت موقت قرار میگیرد.
تابع exportReferencesGraph برای سازندههایی مفید است که میخواهند کاری روی کلاستر یک مسیر انبار انجام دهند. نمونهها شامل سازندهها در NixOS هستند که رمدیسک اولیه را برای راهاندازی لینوکس (یک آرشیو cpio حاوی کلاستر اسکریپت راهاندازی) و تصویر ISO-9660 را برای سیدی نصب (که با یک انبار Nix حاوی کلاستر یک پیکربندی بوتشدنی NixOS پر شده است) تولید میکنند.
- [
passAsFile]\ فهرستی از نام صفات که باید بهجای متغیرهای محیطی، از طریق فایلها منتقل شوند. برای مثال، اگر شما دارای
passAsFile = ["big"];
big = "a very long string"; سپس هنگامی که سازنده (builder) اجرا میشود، متغیر محیطی bigPath شامل مسیر مطلق یک فایل موقت خواهد بود که حاوی a very long string است. یعنی برای هر صفت x که در passAsFile فهرست شده باشد، Nix یک متغیر محیطی xPath را ارسال میکند که حاوی مسیر فایل دربردارندهٔ مقدار صفت x است. این ویژگی زمانی مفید است که بخواهید رشتههای بزرگی را به یک سازنده (builder) ارسال کنید، زیرا اکثر سیستمعاملها محدودیتی را بر روی اندازه محیط (معمولاً چند صد کیلوبایت) اعمال میکنند.
[
__structuredAttrs]\ اگر صفت ویژهٔ__structuredAttrsروی مقدارtrueتنظیم شود، سایر صفات derivation در یک فایل با فرمت JSON سریالایز میشوند.این کار نیاز به
passAsFileرا از بین میبرد؛ زیرا بر خلاف محیطهای فرآیند، فایلهای JSON هیچگونه محدودیت انواعی در اندازه ندارند. همچنین این امکان را فراهم میکند تا تنظیمات derivation را به شکلی ساختاریافته تنظیم کنید؛ برای نمونهoutputChecksرا ببینید.برای جزئیات بیشتر، به بخش مربوطه در صفحه derivation مراجعه کنید.
Warning
اگر روی
trueتنظیم شود، سایر صفات پیشرفته مانندallowedReferences،allowedRequisites،disallowedReferences،disallowedRequisites، maxSize و maxClosureSize هیچ اثری نخواهند داشت.
بررسیهای خروجی
بخش مربوطه در صفحه خروجی derivation را ببینید.
- [
allowedReferences]\ صفت اختیاریallowedReferencesفهرستی از ارجاعات (وابستگیهای) مجاز خروجی سازنده (builder) را مشخص میکند. برای مثال،
allowedReferences = []; تضمین میکند که خروجی یک derivation نمیتواند هیچگونه وابستگی زمان اجرا به ورودیهای خود داشته باشد. برای اجازه دادن به اینکه یک خروجی دارای وابستگی زمان اجرا به خودش باشد، از "out" به عنوان یک عنصر فهرست استفاده کنید. این ویژگی در NixOS برای بررسی این موضوع استفاده میشود که فایلهای تولیدشده مانند رمدیسکهای اولیه برای راهاندازی لینوکس، وابستگیهای تصادفی به مسیرهای دیگر در انبار Nix نداشته باشند.
- [
allowedRequisites]\ این صفت شبیه بهallowedReferencesاست، اما ملزومات مجاز کل کلوزر (closure)، یعنی تمام وابستگیها را به صورت بازگشتی مشخص میکند. برای مثال،
allowedRequisites = [ foobar ]; تضمین میکند که خروجی یک derivation نمیتواند هیچ وابستگی زمان اجرای دیگری به غیر از foobar داشته باشد، و علاوه بر این، تضمین میکند که خودِ foobar نیز هیچ وابستگی دیگری را وارد نکند.
- [
disallowedReferences]\ صفت اختیاریdisallowedReferencesفهرستی از ارجاعات (وابستگیهای) غیرمجاز خروجی سازنده را مشخص میکند. برای مثال،
disallowedReferences = [ foo ]; تضمین میکند که خروجی یک derivation نمیتواند وابستگی زمان اجرای مستقیماً به derivation مربوط به foo داشته باشد.
- [
disallowedRequisites]\ این صفت مشابهdisallowedReferencesاست، اما نیازمندیهای غیرمجاز را برای کل closure (بستار)، یعنی تمام وابستگیها به صورت بازگشتی، مشخص میکند. برای مثال،
disallowedRequisites = [ foobar ]; تضمین میکند که خروجی یک derivation نمیتواند هیچ وابستگی زمان اجرایی به foobar یا هر derivation دیگری که بهصورت بازگشتی به foobar وابسته است، داشته باشد.
[
outputChecks]\ هنگام استفاده از صفتهای ساختاریافته، صفتoutputChecksامکان تعریف بررسیها را به ازای هر خروجی فراهم میکند.علاوه بر
allowedReferences،allowedRequisites،disallowedReferencesوdisallowedRequisites، صفتهای زیر نیز در دسترس هستند:maxSizeحداکثر اندازه شیء انبار حاصل را تعریف میکند.maxClosureSizeحداکثر اندازه closure خروجی را تعریف میکند.ignoreSelfRefsکنترل میکند که آیا هنگام بررسی ارجاعات/ملزومات مجاز، باید خودارجعیها (self-references) در نظر گرفته شوند یا خیر.
مثال:
__structuredAttrs = true;
outputChecks.out = {
# The closure of 'out' must not be larger than 256 MiB.
maxClosureSize = 256 * 1024 * 1024;
# It must not refer to the C compiler or to the 'dev' output.
disallowedRequisites = [ stdenv.cc "dev" ];
};
outputChecks.dev = {
# The 'dev' output must not be larger than 128 KiB.
maxSize = 128 * 1024;
}; سایر تغییرات خروجی
[
unsafeDiscardReferences]\ هنگام استفاده از صفات ساختاریافته، صفتunsafeDiscardReferencesیک مجموعه ویژگی با یک مقدار بولین برای هر نام خروجی است. اگر رویtrueتنظیم شود، اسکن کردن خروجی برای یافتن وابستگیهای زمان اجرا را غیرفعال میکند.مثال:
__structuredAttrs = true;
unsafeDiscardReferences.out = true; این امر به عنوان مثال هنگام تولید تصاویر سیستمفایل خودمختار با انبار Nix تعبیهشدهی خود مفید است: هشهای یافتشده در چنین تصویری به انبار تعبیهشده اشاره میکنند و نه انبار Nix میزبان.
زمانبندی ساخت
[
preferLocalBuild]\ اگر این صفت روی مقدارtrueتنظیم شود و ساختهای توزیعشده فعال باشند، در صورت امکان، درایویشن به جای ارسال به یک ماشین راه دور، بهصورت محلی ساخته خواهد شد. این گزینه برای درایویشنهایی مفید است که ساخت آنها بهصورت محلی کمهزینهتر است.[
allowSubstitutes]\ اگر این صفت روی مقدارfalseتنظیم شود، Nix همیشه این درایویشن را (بهصورت محلی یا راه دور) خواهد ساخت؛ و تلاشی برای جایگزینی خروجیهای آن نخواهد کرد. این گزینه برای درایویشنهایی مفید است که ساخت آنها ارزانتر از جایگزین کردنشان است.با تنظیم
always-allow-substitutesرویtrueمیتوان از این صفت صرفنظر کرد.نکته
اگر روی
falseتنظیم شود،builderباید قادر باشد روی نوع سیستم مشخصشده درصفت systemاجرا شود، زیرا درایویشن قابل جایگزینی نیست.[
requiredSystemFeatures]\ اگر یک درایویشن دارای صفتrequiredSystemFeaturesباشد، Nix آن را فقط روی ماشینی میسازد که ویژگیهای متناظر در پیکربندیsystem-featuresآن تنظیم شده باشند.به عنوان مثال، تنظیم
requiredSystemFeatures = [ "kvm" ]; تضمین میکند که derivation فقط روی ماشینی با قابلیت kvm قابل ساخت است.
پیکربندی سازنده ناخالص
- [
impureEnvVars]\ این صفت به شما اجازه میدهد فهرستی از متغیرهای محیطی را مشخص کنید که باید از محیط کاربر فراخواننده به سازنده منتقل شوند. معمولاً وقتی سازنده اجرا میشود، محیط بهطور کامل پاکسازی میشود، اما با استفاده از این صفت میتوانید اجازه دهید متغیرهای محیطی خاصی بدون تغییر منتقل شوند. برای مثال،fetchurlدر Nixpkgs دارای خط زیر است
impureEnvVars = [ "http_proxy" "https_proxy" ... ]; تا از آن برای استفاده از پیکربندی سرور پروکسی مشخصشده توسط کاربر
در متغیرهای محیطی http_proxy و موارد مشابه استفاده کند.
این صفت فقط در [درایویشنهای با خروجی ثابت][fixed-output derivation] مجاز است، جایی که ناخالصیهایی مانند اینها مشکلی ندارند؛ زیرا (هش) خروجی از پیش مشخص است. این صفت برای سایر درایویشنها نادیده گرفته میشود.
هشدار
پیادهسازی
impureEnvVarsمتغیرهای محیطی را از فرآیند سازنده فعلی میگیرد. وقتی یک daemon در حال ساخت است، متغیرهای محیطی آن استفاده میشوند. بدون daemon، متغیرهای محیطی از محیطnix-buildگرفته میشوند.
اگر ویژگی آزمایشی [configurable-impure-env](/pages/nix-manual/development/experimental-features#xp-feature-configurable-impure-env) فعال باشد، این متغیرهای محیطی را میتوان از طریق
تنظیمات پیکربندی impure-env نیز کنترل کرد.
تنظیم نوع درایویشن
همانطور که در خروجیهای درایویشن و انواع درایویشنها بحث شد، چندین نوع درایویشن / نوع خروجی درایویشن وجود دارد. انتخاب صفات زیر مشخص میکند که ما در حال ساخت چه نوع درایویشنی هستیم.
[
__contentAddressed][
outputHash][
outputHashAlgo][
outputHashMode]
سه نوع درایویشن بر اساس ترکیبهای زیر از این صفات انتخاب میشوند. سایر ترکیبها نامعتبر هستند.
درایویشنهای آدرسدهیشده بر اساس ورودی
این حالت پیشفرض برای
builtins.derivationاست. نیکس در حال حاضر فقط از یک نوع آدرسدهی بر اساس ورودی پشتیبانی میکند، بنابراین به اطلاعات دیگری نیاز نیست.مقدار
__contentAddressed = false;نیز ممکن است گنجانده شود، اما ضروری نیست و بررسی ویژگی آزمایشی را فعال خواهد کرد.[درایویشنهای با خروجی ثابت][fixed-output derivation]
تمامی موارد [
outputHash]، [outputHashAlgo] و [outputHashMode].
درایویشنهای آدرسدهیشده بر اساس محتوا (شناور)
هر دو صفت [
outputHashAlgo] و [outputHashMode]، به همراه__contentAddressed = true;و بدونoutputHash.اگر هش خروجی ارائه میشد، خروجی درایویشن به جای «شناور»، «ثابت» میبود.
اطلاعات بیشتر درباره صفات output* و مقادیری که میتوانند به خود اختصاص دهند در ادامه آمده است:
-
این صفت مشخص میکند که چگونه فایلهای یک خروجی درایویشن آدرسدهیشده بر اساس محتوا، برای تولید یک آدرس محتوا پردازش (هَش) میشوند.
این کار در ترکیب با
outputHashAlgoانجام میشود. مشخص کردن یکی بدون دیگری یک خطا محسوب میشود (مگر اینکه [outputHash] نیز مشخص شده باشد و الگوریتم هش مخصوص به خود را همانطور که در ادامه توضیح داده شده، شامل شود).صفت
outputHashModeنحوه محاسبه هش را تعیین میکند. این صفت باید یکی از مقادیر زیر باشد:-
این حالت پیشفرض است.
-
سازگاری
عبارت
"recursive"روش سنتی برای نشان دادن این موضوع است، و از سال ۲۰۰۵ (تقریباً تمام تاریخچهٔ Nix) پشتیبانی میشود. عبارت"nar"واضحتر است و با سایر بخشهای Nix (مانند رابط خط فرمان) سازگاری دارد، با این حال پشتیبانی از آن فقط از نسخه ۲.۲۱ به Nix اضافه شده است.
-
هشدار
استفاده از این روش برای خروجیهای derivation بخشی از ویژگی آزمایشی [
dynamic-derivations][xp-feature-dynamic-derivations] است. -
هشدار
این روش بخشی از ویژگی آزمایشی [
git-hashing][xp-feature-git-hashing] است.برای کسب اطلاعات بیشتر درباره فرآیندی که این پرچم کنترل میکند، به اشیای انبار با آدرس محتوایی مراجعه کنید.
-
این گزینه، الگوریتم هش مورد استفاده برای محاسبهٔ دادههای [شیء سیستمفایل] یک خروجی derivation با آدرس محتوایی را مشخص میکند.
این مورد به همراه
outputHashModeکار میکند. مشخص کردن یکی بدون دیگری یک خطا محسوب میشود (مگر اینکهoutputHashنیز مشخص شده باشد و شامل الگوریتم هش مخصوص به خود باشد که در ادامه توضیح داده شده است).صفت
outputHashAlgoالگوریتم هش مورد استفاده برای محاسبهٔ هش را مشخص میکند. در حال حاضر این مقدار میتواند"blake3"،"sha1"،"sha256"،"sha512"یاnullباشد.مقدار
outputHashAlgoتنها زمانی میتواندnullباشد کهoutputHashاز فرمت SRI پیروی کند، زیرا در این صورت انتخاب الگوریتم هش توسطoutputHashتعیین میشود. -
این صفت، هش خروجی یک خروجی منفرد از یک [derivation با خروجی ثابت] را مشخص میکند.
صفت
outputHashباید رشتهای باشد که حاوی هش با کدگذاری هگزادسیمال یا "nix32"، یا به پیروی از فرمت فرادادههای یکپارچگی تعریفشده توسط SRI باشد. کدگذاری "nix32" گونهای از کدگذاری Base32 مختص Nix است.نکته
تابع
convertHashنحوهٔ تبدیل بین کدگذاریهای مختلف را نشان میدهد. دستورnix-hashحاوی اطلاعاتی دربارهٔ نحوهٔ دریافت هش برای برخی محتویات و همچنین تبدیل به کدگذاریها و از آنها است. -
هشدار
این صفت بخشی از یک ویژگی آزمایشی است.
برای استفاده از این صفت، باید ویژگی آزمایشی [
ca-derivations][xp-feature-ca-derivations] را فعال کنید. به عنوان مثال، در فایل nix.conf میتوانید این مورد را اضافه کنید:
> extra-experimental-features = ca-derivations
> ```
این یک مقدار بولی (boolean) با مقدار پیشفرض `false` است.
این گزینه تعیین میکند که آیا derivation بهصورت آدرسدهیشده بر اساس محتوای شناور (floating content-addressing) است یا خیر.
[`__contentAddressed`]: #adv-attr-__contentAddressed
[`outputHash`]: #adv-attr-outputHash
[`outputHashAlgo`]: #adv-attr-outputHashAlgo
[`outputHashMode`]: #adv-attr-outputHashMode
[fixed-output derivation]: /pages/nix-manual/glossary#gloss-fixed-output-derivation
[file system object]: /pages/nix-manual/store/file-system-object
[store object]: /pages/nix-manual/store/store-object
[xp-feature-dynamic-derivations]: /pages/nix-manual/development/experimental-features#xp-feature-dynamic-derivations
[xp-feature-git-hashing]: /pages/nix-manual/development/experimental-features#xp-feature-git-hashing