1. مقدمه
نیکس یک مدیر بستههای تابعی خالص است. این یعنی بستهها را مانند مقادیر در یک زبان برنامهنویسی کاملاً تابعی در نظر میگیرد — بستهها توسط توابعی ساخته میشوند که هیچ اثرات جانبی ندارند و پس از ساخته شدن هرگز تغییر نمیکنند. نیکس بستهها را در انبار نیکس (معمولاً پوشه /nix/store) ذخیره میکند که در آن هر بسته زیرپوشه منحصربهفرد خود را دارد؛ مانند:
/nix/store/q06x3jll2yfzckz2bzqak089p43ixkkq-firefox-33.1/
که در آن q06x3jll2yfz… یک شناسه منحصربهفرد برای بسته است که تمام وابستگیهای آن را ثبت میکند (این شناسه یک هش رمزنگاریشده از گراف وابستگی ساخت بسته است). این ویژگی امکانات قدرتمند بسیاری را فراهم میکند.
نسخههای متعدد
شما میتوانید چندین نسخه یا گونه از یک بسته را بهطور همزمان نصب داشته باشید. این موضوع بهویژه زمانی که برنامههای مختلف به نسخههای متفاوتی از یک بسته وابستگی دارند بسیار مهم است — این کار مانع از «جهنم DLL» میشود. به دلیل طرح هشگذاری، نسخههای مختلف یک بسته در مسیرهای متفاوتی در انبار نیکس قرار میگیرند، بنابراین هیچ تداخلی با یکدیگر ندارند.
یک نتیجه مهم این است که عملیاتی مانند ارتقا یا حذف نصب یک برنامه نمیتواند برنامههای دیگر را خراب کند، زیرا این عملیات هرگز فایلهایی را که توسط بستههای دیگر استفاده میشوند بهطور «تخریبگر» بهروزرسانی یا حذف نمیکنند.
وابستگیهای کامل
نیکس به شما کمک میکند مطمئن شوید که مشخصات وابستگی بسته کامل هستند. بهطور کلی، هنگامی که برای یک سیستم مدیریت بسته مانند RPM بستهای میسازید، باید برای هر بسته مشخص کنید که وابستگیهای آن چیستند، اما هیچ تضمینی وجود ندارد که این مشخصات کامل باشند. اگر یک وابستگی را فراموش کنید، بسته روی سیستم خودتان (در صورتی که آن وابستگی را نصب کرده باشید) بهدرستی ساخته شده و کار میکند، اما روی سیستم کاربر نهایی (اگر آن را نداشته باشد) کار نخواهد کرد.
از آنجا که نیکس برخلاف آن، بستهها را در مکانهای «سرتاسر سیستم» مانند /usr/bin نصب نمیکند، بلکه در پوشههای مختص بسته قرار میدهد، خطر ناقص بودن وابستگیها به میزان قابلتوجهی کاهش مییابد. دلیل این امر آن است که ابزارهایی مانند کامپایلرها در پوشههای مختص بسته مانند /nix/store/5lbfaxb722zp…-openssl-0.9.8d/include جستجو نمیکنند، بنابراین اگر بستهای روی سیستم شما بهدرستی ساخته شود، به این دلیل است که شما وابستگی را بهصورت صریح مشخص کردهاید. این کار وابستگیهای زمان ساخت را مدیریت میکند.
هنگامی که یک بسته ساخته شد، وابستگیهای زمان اجرا با اسکن کردن باینریها برای یافتن بخشهای هش مسیرهای انبار نیکس (مانند r8vvq9kq…) پیدا میشوند. این کار ممکن است خطرناک به نظر برسد، اما بسیار عالی کار میکند.
پشتیبانی چندکاربره
نیکس دارای پشتیبانی چندکاربره است. این یعنی کاربران بدون دسترسی ویژه میتوانند با امنیت نرمافزار نصب کنند. هر کاربر میتواند پروفایل متفاوتی داشته باشد؛ مجموعهای از بستهها در انبار نیکس که در متغیر محیطی PATH کاربر ظاهر میشوند. اگر کاربری بستهای را نصب کند که کاربر دیگری قبلاً آن را نصب کرده است، آن بسته برای بار دوم ساخته یا بارگیری نخواهد شد. در عین حال، برای هیچ کاربری امکانپذیر نیست که یک اسب تروجان را وارد بستهای کند که ممکن است توسط کاربر دیگری استفاده شود.
ارتقاهای اتمی و بازگردانیها
از آنجا که عملیات مدیریت بسته هرگز بستهها را در انبار نیکس بازنویسی نمیکنند بلکه صرفاً نسخههای جدید را در مسیرهای جدید اضافه میکنند، این عملیاتها اتمی هستند. بنابراین در طول ارتقای یک بسته، هیچ بازه زمانی وجود ندارد که در آن بسته برخی فایلها را از نسخه قدیمی و برخی فایلها را از نسخه جدید داشته باشد — که اتفاق بدی خواهد بود زیرا ممکن است یک برنامه اگر در طول آن دوره آغاز شود، کرش کند.
و از آنجا که بستهها بازنویسی نمیشوند، نسخههای قدیمی همچنان پس از یک ارتقا در آنجا باقی میمانند. این یعنی میتوانید به نسخه قدیمی بازگردانی (rollback) کنید:
$ nix-env --upgrade --attr nixpkgs.some-package
$ nix-env --rollback جمعآوری زباله (garbage collection)
وقتی بستهای را بهاینصورت حذف نصب میکنید…
$ nix-env --uninstall firefox بسته بلافاصله از سیستم حذف نمیشود (بالاخره، ممکن است بخواهید یک بازگردانی انجام دهید، یا شاید در پروفایلهای سایر کاربران قرار داشته باشد). در عوض، بستههای استفادهنشده را میتوان با اجرای جمعکنندهی زباله (garbage collector) به طور ایمن حذف کرد:
$ nix-collect-garbage این دستور تمام بستههایی را که توسط هیچ پروفایل کاربری یا برنامهای که در حال حاضر در حال اجراست استفاده نمیشوند، حذف میکند.
زبان بستهبندی تابعی
بستهها از عبارتهای نیکس (Nix expression) ساخته میشوند که یک زبان تابعی ساده است. یک عبارت Nix تمام مواردی را که وارد یک فرآیند ساخت بسته (یک «درایویشن») میشوند، توصیف میکند: بستههای دیگر، کدهای منبع، اسکریپت ساخت، متغیرهای محیطی برای اسکریپت ساخت و غیره. نیکس تلاش زیادی میکند تا مطمئن شود عبارتهای Nix قطعی هستند: ساخت مجدد یک عبارت Nix باید همان نتیجه را به همراه داشته باشد.
از آنجا که این یک زبان تابعی است، پشتیبانی از ساخت گونههای مختلف یک بسته کار آسانی است: کافی است عبارت Nix را به یک تابع تبدیل کنید و آن را به تعداد دلخواه با آرگومانهای مناسب فراخوانی کنید. به دلیل طرحوارهی هش کردن، گونههای مختلف در انبار Nix با یکدیگر تداخل پیدا نمیکنند.
استقرار شفاف از روی کد منبع / باینری
عبارتهای Nix به طور کلی نحوه ساخت یک بسته را از روی کد منبع توصیف میکنند، بنابراین یک عمل نصب مانند
$ nix-env --install --attr nixpkgs.firefox میتواند فعالیت ساخت نسبتاً زیادی ایجاد کند، زیرا نه تنها Firefox بلکه تمام وابستگیهای آن (تا جایی که به کتابخانه C و کامپایلر میرسد) باید ساخته شوند؛ حداقل اگر از قبل در انبار نیکس (Nix store) موجود نباشند. این یک مدل استقرار از روی کد منبع است. برای بیشتر کاربران، ساخت از منبع چندان خوشایند نیست چون زمان بسیار زیادی میبرد. با این حال، نیکس میتواند به طور خودکار از ساخت از منبع صرفنظر کرده و در عوض از یک کَش باینری استفاده کند؛ یک وبسرور که باینریهای پیشساخته را فراهم میکند. برای نمونه، وقتی از نیکس خواسته میشود تا /nix/store/b6gvzjyb2pg0…-firefox-33.1 را از منبع بسازد، ابتدا بررسی میکند که آیا فایل https://cache.nixos.org/b6gvzjyb2pg0….narinfo وجود دارد یا خیر، و اگر وجود داشت، باینری پیشساختهی ارجاع دادهشده از آنجا را دریافت میکند؛ در غیر این صورت، به ساخت از منبع بازمیگردد.
مجموعهی بستههای نیکس (Nixpkgs)
ما مجموعه بزرگی از عبارتهای نیکس شامل صدها بسته یونیکس موجود را ارائه میدهیم که به آن مجموعهی بستههای نیکس (Nixpkgs) (Nixpkgs) میگویند.
مدیریت محیطهای ساخت
نیکس برای توسعهدهندگان بسیار مفید است زیرا راهاندازی خودکار محیط ساخت یک بسته را آسان میکند. با داشتن یک عبارت نیکس که وابستگیهای بسته شما را توصیف میکند، دستور nix-shell آن دسته از وابستگیهایی را که از قبل در انبار نیکس شما حضور ندارند، میسازد یا بارگیری میکند و سپس یک شل Bash را آغاز میکند که در آن تمام متغیرهای محیطی لازم (مانند مسیرهای جستجوی کامپایلر) تنظیم شدهاند.
برای نمونه، دستور زیر تمام وابستگیهای خبرخوان Pan را، همانطور که توسط عبارت نیکس آن توصیف شده است، دریافت میکند:
$ nix-shell '<nixpkgs>' --attr pan سپس به یک شل (Shell) هدایت میشوید که در آن میتوانید بسته را ویرایش، ساخته (build) و تست کنید:
[nix-shell]$ unpackPhase
[nix-shell]$ cd pan-*
[nix-shell]$ configurePhase
[nix-shell]$ buildPhase
[nix-shell]$ ./pan/gui/pan قابلیت انتقال (Portability)
نیکس روی لینوکس، macOS و FreeBSD اجرا میشود.
NixOS
سیستمعامل NixOS یک توزیع لینوکس است که بر پایه نیکس ساخته شده است. این سیستمعامل از نیکس نه تنها برای مدیریت بسته، بلکه برای مدیریت پیکربندی سیستم (بهعنوان مثال، ساخت فایلهای پیکربندی در /etc) نیز استفاده میکند. این ویژگی به این معناست که، از جمله مزایای دیگر، بازگردانی کل پیکربندی سیستم به وضعیتی قبلی بهسادگی امکانپذیر است. همچنین، کاربران میتوانند بدون دسترسی ویژه (root) نرمافزار نصب کنند. برای کسب اطلاعات بیشتر و بارگیری، به صفحه اصلی NixOS مراجعه کنید.
مجوز
نیکس تحت شرایط مجوز GNU LGPLv2.1 یا (به انتخاب خود شما) هر نسخهٔ جدیدتر آن منتشر شده است.