فا نیکسی

اسکریپت‌های تفسیری بازتولیدپذیر

در این آموزش، شما یاد خواهید گرفت که چگونه از Nix برای ایجاد و اجرای اسکریپت‌های تفسیری بازتولیدپذیر، که به عنوان اسکریپت‌های shebang نیز شناخته می‌شوند، استفاده کنید.

الزامات

یک اسکریپت ساده با وابستگی‌های غیربدیهی

اسکریپت زیر را در نظر بگیرید که محتوای XML یک URL را دریافت کرده، آن را به JSON تبدیل می‌کند و برای خوانایی بهتر قالب‌بندی می‌کند:

#! /bin/bash

curl https://github.com/NixOS/nixpkgs/releases.atom | xml2json | jq .

این برنامه به برنامه‌های curl، xml2json و jq نیاز دارد. همچنین به مفسر bash نیاز دارد. اگر هر یک از این وابستگی‌ها روی سیستمی که اسکریپت را اجرا می‌کند موجود نباشد، اسکریپت به‌صورت جزئی یا کلی با خطا مواجه خواهد شد.

با استفاده از Nix، می‌توانیم تمام وابستگی‌ها را به‌صورت صریح اعلام کنیم و اسکریپتی تولید کنیم که همیشه روی هر ماشینی که از Nix و بسته‌های مورد نیاز گرفته‌شده از Nixpkgs پشتیبانی می‌کند، اجرا شود.

اسکریپت

خط shebang تعیین می‌کند که از چه برنامه‌ای برای اجرای یک اسکریپت تفسیری استفاده شود.

ما از خط shebang به شکل #!/usr/bin/env nix-shell استفاده خواهیم کرد.

env برنامه‌ای است که در اکثر سیستم‌عامل‌های مدرن یونیکس‌مانند در مسیر سیستم‌فایلی /usr/bin/env در دسترس است. این برنامه نام یک دستور را به عنوان آرگومان می‌گیرد و اولین فایل اجرایی با آن نام را که در پوشه‌های فهرست‌شده در متغیر محیطی $PATH پیدا کند، اجرا خواهد کرد.

ما از nix-shell as a shebang interpreter استفاده می‌کنیم. این ابزار پارامترهای زیر را که برای مورد استفاده‌ی ما مرتبط هستند می‌پذیرد:

  • -i مشخص می‌کند که برای تفسیر بقیه‌ی فایل از چه برنامه‌ای استفاده شود
  • --pure بیشتر متغیرهای محیطی را هنگام اجرای اسکریپت حذف می‌کند
  • -p بسته‌هایی را که باید در محیط مفسر حضور داشته باشند فهرست می‌کند
  • -I [مسیر جستجوی ارجاع (ref-search-path)] را برای بسته‌ها به‌صورت صریح تنظیم می‌کند

جزئیات بیشتر درباره‌ی گزینه‌ها را می‌توانید در مستندات مرجع nix-shell بیابید.

فایلی به نام nixpkgs-releases.sh با محتوای زیر ایجاد کنید:

#!/usr/bin/env nix-shell
#! nix-shell -i bash --pure
#! nix-shell -p bash cacert curl jq python3Packages.xmljson
#! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/2a601aafdc5605a5133a2ca506a34a3a73377247.tar.gz

curl https://github.com/NixOS/nixpkgs/releases.atom | xml2json | jq .

اولین خط یک shebang استاندارد است. خطوط shebang اضافی یک ساختار مخصوص Nix هستند:

  • با گزینه -i، برنامه‌ی bash به عنوان مفسر برای بقیه فایل مشخص می‌شود.

  • در این حالت، گزینه‌ی --pure فعال می‌شود تا از استفاده‌ی ضمنی اسکریپت از برنامه‌هایی که ممکن است از پیش روی سیستمی که اسکریپت روی آن اجرا می‌شود وجود داشته باشند، جلوگیری کند.

  • گزینه‌ی -p بسته‌های مورد نیاز برای اجرای اسکریپت را فهرست می‌کند.

    دستور xml2json توسط بسته‌ی python3Packages.xmljson فراهم می‌شود، در حالی که bash، jq و curl توسط بسته‌هایی با همین نام فراهم می‌شوند. بسته‌ی cacert باید حضور داشته باشد تا احراز هویت SSL کار کند.

راهنمایی

برای پیدا کردن بسته‌هایی که برنامه‌ی مورد نیاز شما را فراهم می‌کنند، از search.nixos.org استفاده کنید.

  • پارامتر -I به یک کامیت مشخص از Git در مخزن Nixpkgs اشاره دارد.

    این کار تضمین می‌کند که اسکریپت همیشه و در همه جا با دقیقاً نسخه‌های یکسانی از بسته‌ها اجرا خواهد شد.

اسکریپت را قابل اجرا کنید:

 chmod +x nixpkgs-releases.sh

اجرای اسکریپت:

./nixpkgs-releases.sh

گام‌های نخستین

  • reading-nix-language برای کسب اطلاعات درباره‌ی زبان Nix که برای اعلام بسته‌ها و پیکربندی‌ها استفاده می‌شود.
  • declarative-reproducible-envs برای ایجاد محیط‌های شل بازتولیدپذیر با یک فایل پیکربندی اعلانی (declarative).
  • جمع‌آوری زباله (garbage collection) آزادسازی فضای ذخیره‌سازی اشغال‌شده توسط برنامه‌های ارائه‌شده از طریق Nix

nix.dev/first-steps/reproducible-scripts

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