فا نیکسی

6.1. پروفایل‌ها

پروفایل‌ها و محیط‌های کاربری، مکانیزم Nix برای پیاده‌سازی این قابلیت هستند که به کاربران مختلف اجازه دهند پیکربندی‌های متفاوتی داشته باشند و ارتقاها و بازگردانی‌های اتمی (atomic) را انجام دهند. برای درک نحوه کارکرد آن‌ها، دانستن کمی درباره نحوه کارکرد Nix مفید است. در Nix، بسته‌ها در مکان‌های منحصر‌به‌فردی در انبار Nix (معمولاً /nix/store) ذخیره می‌شوند. برای نمونه، نسخه خاصی از بسته Subversion ممکن است در پوشه‌ای به آدرس /nix/store/dpmvp969yhdqs7lm2r1a3gng7pyq6vy4-subversion-1.1.3/ ذخیره شود، در حالی که نسخه دیگری ممکن است در /nix/store/5mq2jcn36ldlmh93yj1n8s9c95pj7c5s-subversion-1.1.2 ذخیره شود. رشته‌های طولانی پیشوندشده به نام پوشه‌ها، هش‌های رمزنگاری‌شده (به‌طور دقیق‌تر، برش‌های ۱۶۰ بیتی از هش‌های SHA-256 کدگذاری‌شده در Nix32) از تمام ورودی‌های درگیر در ساخت بسته هستند — کدهای منبع، وابستگی‌ها، پرچم‌های کامپایلر و غیره. بنابراین اگر دو بسته به هر طریقی با یکدیگر تفاوت داشته باشند، در مکان‌های متفاوتی در سیستم‌فایل قرار خواهند گرفت تا با یکدیگر تداخل پیدا نکنند. در ادامه بخشی از یک انبار Nix معمولی نمایش داده شده است:

user-environments.png

البته، شما هرگز تمایلی نخواهید داشت که بنویسید

$ /nix/store/dpmvp969yhdq...-subversion-1.1.3/bin/svn

هر بار که می‌خواهید Subversion را اجرا کنید. البته که می‌توانیم متغیر محیطی PATH را طوری تنظیم کنیم که پوشه bin مربوط به هر بسته مورد نظر ما را شامل شود، اما این روش چندان راحت نیست؛ زیرا تغییر PATH روی فرآیندهای از‌پیش‌موجود اعمال نمی‌شود. راه حل Nix این است که درخت‌های پوشه‌ای از پیوندهای نمادین (symlinks) را به بسته‌های فعال‌شده ایجاد کند. به این موارد پروفایل‌های کاربری (user environments) گفته می‌شود و خودشان نیز بسته محسوب می‌شوند (اگرچه به‌طور خودکار توسط nix-env تولید می‌شوند)، بنابراین آن‌ها نیز در انبار Nix قرار دارند. برای نمونه، در شکل بالا، پروفایل کاربری /nix/store/0c1p5z4kda11...-user-env شامل یک پیوند نمادین (symlink) به بسته Subversion 1.1.2 است (فلش‌های موجود در شکل نشان‌دهنده‌ی پیوندهای نمادین (symlinks) هستند). این همان چیزی است که اگر این کار را انجام داده بودیم به دست می‌آمد

$ nix-env --install --attr nixpkgs.subversion

روی مجموعه‌ای از عبارت‌های Nix که حاوی Subversion 1.1.2 بودند.

البته این موضوع به خودی خود مشکل را حل نمی‌کند؛ مسلماً شما هم نمی‌خواهید دستور /nix/store/0c1p5z4kda11...-user-env/bin/svn را تایپ کنید. به همین دلیل است که پیوندهای نمادین (symlinks) در خارج از انبار وجود دارند که به محیط‌های کاربری درون انبار اشاره می‌کنند؛ برای مثال، پیوندهای نمادین default-42-link و default-43-link در مثال ذکرشده. به این موارد نسل (generations) گفته می‌شود، زیرا هر بار که عملیات nix-env را انجام می‌دهید، یک محیط کاربری جدید بر اساس محیط فعلی تولید می‌شود. برای مثال، نسل ۴۳ از نسل ۴۲ ایجاد شد وقتی که ما کار زیر را انجام دادیم:

$ nix-env --install --attr nixpkgs.subversion nixpkgs.firefox

روی مجموعه‌ای از عبارت‌های Nix که شامل Firefox و نسخه جدیدی از Subversion بودند.

نسل‌ها در قالب پروفایل‌ها گروه‌بندی می‌شوند تا کاربران مختلف در صورت تمایل مزاحم کار یکدیگر نشوند. برای مثال:

$ ls -l /nix/var/nix/profiles/
...
lrwxrwxrwx  1 eelco ... default-42-link -> /nix/store/0c1p5z4kda11...-user-env
lrwxrwxrwx  1 eelco ... default-43-link -> /nix/store/3aw2pdyx2jfc...-user-env
lrwxrwxrwx  1 eelco ... default -> default-43-link

این یک پروفایل به نام default را نشان می‌دهد. خود فایل default در واقع یک پیوند نمادین (symlink) است که به نسخهٔ فعلی اشاره می‌کند. هنگامی که عملیاتی با nix-env انجام می‌دهیم، یک محیط کاربری و پیوند نسخهٔ جدید بر اساس نسخهٔ فعلی ایجاد می‌شود و در نهایت پیوند نمادین default به‌گونه‌ای تنظیم می‌شود که به نسخهٔ جدید اشاره کند. این مرحله‌ی آخر در یونیکس به صورت اتمی (atomic) انجام می‌شود، که دلیل امکان‌پذیر بودن ارتقاهای اتمی را توضیح می‌دهد. (توجه داشته باشید که فرآیند ساخت/نصب بسته‌های جدید به هیچ وجه با بسته‌های قدیمی تداخل ندارد، زیرا آن‌ها در مکان‌های متفاوتی در انبار Nix ذخیره می‌شوند.)

اگر متوجه شدید که می‌خواهید یک عملیات nix-env را به حالت قبل برگردانید (بازگردانی)، کافی است دستور زیر را اجرا کنید

$ nix-env --rollback

که تنها باعث می‌شود پیوند نسل فعلی به پیوند قبلی اشاره کند. برای مثال، default طوری تنظیم می‌شود که به default-42-link اشاره کند. همچنین می‌توانید به یک نسل خاص سوییچ کنید:

$ nix-env --switch-generation 43

که در این مثال، دوباره به نسل ۴۳ جلو (roll forward) می‌رود. همچنین می‌توانید تمام نسل‌های موجود را مشاهده کنید:

$ nix-env --list-generations

شما معمولاً مسیر /nix/var/nix/profiles/some-profile/bin را در PATH خود نخواهید داشت. در عوض، یک پیوند نمادین (symlink) به نام ~/.nix-profile وجود دارد که به پروفایل فعلی شما اشاره می‌کند. این یعنی باید ~/.nix-profile/bin را در PATH خود قرار دهید (و در واقع، اسکریپت راه‌اندازی /nix/etc/profile.d/nix.sh نیز همین کار را انجام می‌دهد). این کار جابجایی به یک پروفایل دیگر را ساده‌تر می‌کند. می‌توانید این کار را با استفاده از دستور nix-env --switch-profile انجام دهید:

$ nix-env --switch-profile /nix/var/nix/profiles/my-profile

$ nix-env --switch-profile /nix/var/nix/profiles/default

این دستورات به ترتیب به پروفایل my-profile و پروفایل پیش‌فرض سوییچ می‌کنند. اگر پروفایل وجود نداشته باشد، به طور خودکار ایجاد خواهد شد. باید مراقب باشید که پروفایل را در مکانی غیر از پوشه profiles ذخیره نکنید، زیرا در غیر این صورت ممکن است به عنوان ریشه جمع‌آوری زباله (garbage collection) استفاده نشود.

تمام عملیات‌های nix-env روی پروفایلی کار می‌کنند که ~/.nix-profile به آن اشاره دارد، اما می‌توانید با استفاده از گزینه --profile (مخفف -p) این رفتار را بازنویسی کنید:

$ nix-env --profile /nix/var/nix/profiles/other-profile --install --attr nixpkgs.subversion

این کار پیوند نمادین ~/.nix-profile را تغییر نخواهد داد.

nix.dev/manual/nix/stable/package-management/profiles.html

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