اسکریپتهای تفسیری بازتولیدپذیر
در این آموزش، شما یاد خواهید گرفت که چگونه از 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