10.2.1. مشخصات مسیر انبار
این مشخصات کامل نحوه محاسبه مسیر انبارها است.
فرمت این مشخصات به فرم بنکوس-نائور توسعهیافته نزدیک است، اما باید در برخی موارد مانند توابع هش که برای اهداف مشخصات آنها را دودوجهی در نظر میگیریم، از آن منحرف شود.
کاربران عادی نیازی به دانستن این اطلاعات ندارند --- مسیرهای انبار را میتوان به عنوان جعبههای سیاهی در نظر گرفت که از ویژگیهای اشیاء انبار ار ارجاعدادهشده به آنها محاسبه میشوند. اما برای کسانی که علاقهمندند دقیقاً بدانند Nix چگونه کار میکند (مثلاً اگر در حال پیادهسازی مجدد آن هستند)، این اطلاعات میتواند مفید باشد.
خود مسیر انبار
store-path = store-dir "/" digest "-" name که در آن
name= نام شیء انبار.store-dir= مسیر پوشه انبارdigest= نمایش Nix32 از هش SHA-256 فشردهشده به ۱۶۰ بیت ازfingerprint.برای تعریف الگوریتم فشردهسازی هش، لطفاً به بخش ۵.۱ از پایاننامه نیکس مراجعه کنید.
اثر انگشت (Fingerprint)
fingerprint = type ":sha256:" inner-digest ":" store ":" name توجه داشته باشید که این مورد شامل مکان انبار و همچنین نام آن میشود تا اطمینان حاصل شود که تغییرات در هر یک از آنها در هش منعکس میشود
(به عنوان مثال، شما /nix/store/<digest>-name1 و /nix/store/<digest>-name2، یا /gnu/store/<digest>-name1 را با بخشهای هش برابر دریافت نخواهید کرد).
type= یکی از موارد زیر:
| "text" { ":" store-path } این برای روش "Text" در آدرسدهی محتوایی انبار اشیاء است. مسیرهای انبار پایانی اختیاری، همان ارجاعات انبار شیء هستند.
| "source" { ":" store-path } [ ":self" ] این برای روش "آرشیو نیکس" جهت آدرسدهی محتوایی انبار اشیاء است،
اگر الگوریتم هش SHA-256 باشد.
درست مانند حالت «Text»، میتوانیم انبار اشیاء را با مسیرهایشان ارجاع دهیم.
علاوه بر این، میتوانیم یک برچسب اختیاری :self برای نشان دادن خودارجاعی داشته باشیم.
| "output:" id برای خروجیهای ساختهشده از درایویشنها، یا اشیاء انبار آدرسدهیشده بر اساس محتوا که از یکی از دو حالت بالا استفاده نمیکنند. برای شفافسازی در مورد حالت دوم، در حال حاضر این روشها عبارتند از:
- "ساده" ("Flat")
- "گیت" ("Git")
- "آرشیو نیکس" ("Nix Archive") اگر الگوریتم هش SHA-256 نباشد.
مقدار id نام خروجی است (معمولاً "out").
برای اشیاء انبار آدرسدهیشده بر اساس محتوا، id همیشه "out" است.
inner-digest= نمایش مبنای ۱۶ از هش SHA-256 برایinner-fingerprint. کدگذاری مبنای ۱۶ از ارقام هگزادسیمال با حروف کوچک استفاده میکند.
اثر انگشت داخلی (Inner fingerprint)
inner-fingerprint= یکی از موارد زیر بر اساسtype:اگر
type="text:" ...:رشته نوشتهشده در مسیر انبار حاصل.
اگر
type="source:" ...:سریالسازی Nix Archive (NAR) از شیء سیستمفایل مربوط به شیء انبار.
اگر
type="output:" id:برای خروجیهای درایویشن آدرسدهیشده بر اساس ورودی:
سریالسازی ATerm مربوط به درایویشن به استثنای درایویشنهای خروجی ثابت.
برای مسیرهای انبار آدرسدهیشده بر اساس محتوا:
"fixed:out:" rec algo ":" hash ":" که در آن
rec= یکی از موارد زیر:
| "" (رشتهی خالی) برای هشهای سریالسازی تخت (تکفایلی)
| "r:" هشهای مربوط به سریالسازی Nix Archive (NAR) (شیء سیستمفایل دلخواه)
| "git:" هشهای قالب بلاک/درخت گیت درخت مرکل
algo = "md5" | "sha1" | "sha256" hash= نمایش مبنای ۱۶ (Hexadecimal) از مسیر یا هش تخت محتویات مسیر (یا محتویات مورد انتظار مسیر برای درایویشنهای با خروجی ثابت).
توجه داشته باشید که id = "out" است، صرفنظر از بخش نام موجود در مسیر انبار.
همچنین توجه داشته باشید که NAR + SHA-256 نباید از این حالت استفاده کند، و در عوض باید از حالت type = "source:" ... استفاده کند.
یادداشت تاریخی
گرامرهای type = "source:" ... و type = "output:out" از نظر مفهومی و از نظر فنی با یکدیگر همپوشانی دارند،
به این معنا که هر دو میتوانند دادههای هششده بر اساس سریالسازی NAR و با استفاده از SHA-256 را نمایش دهند.
دلیل اصلی این شیوه از محاسبهی نامها، جلوگیری از تداخل نامها (به دلایل امنیتی) بود.
برای مثال، اینگونه تصور میشد که نباید امکانپذیر باشد که درایویشنی ایجاد شود که مسیر خروجی آن با مسیر یک سورس کپیشده تداخل داشته باشد.
مورد اول دارای یک inner-fingerprint با شروع از output:out: خواهد بود، در حالی که مورد دوم دارای یک inner-fingerprint با شروع از source: خواهد بود.
با این حال، از زمان کامیت 64519cfd657d024ae6e2bb74cb21ad21b886fd2a (سال ۲۰۰۸)، تصمیم گرفته شد که جداسازی دادههای آدرسپذیر بر اساس محتوا (content-addressed) که توسط درایویشن تولید شدهاند در برابر مواردی که به صورت دستی هش شدهاند، به این شکل مفید نیست.
اکنون، دادههایی که با SHA-256 + سریالسازی NAR بر اساس محتوا آدرسدهی میشوند، همیشه از ساختار source:... استفاده میکنند، صرفنظر از اینکه چگونه تولید شدهاند (به صورت دستی یا توسط درایویشن).
این امر امکان جابجایی آزادانه بین استفاده از درایویشنهای با خروجی ثابت برای دریافت (fetch) و دریافت خارج از باند (out-of-band) و سپس افزودن دستی را فراهم میکند.
همچنین این تغییر، ابهام را از گرامر حذف میکند.