নিক এক্সপ্রেশন
একটি নিক্স এক্সপ্রেশন হ'ল কোনও প্রোগ্রামিং ল্যাঙ্গুয়েজ এক্সপ্রেশনের মতো: যে কোনও কিছু যা কোনও মান বা ফাংশনকে মূল্যায়ন করে। এই ক্ষেত্রে একটি মান এছাড়াও একটি তালিকা বা একটি সেট হতে পারে। যেহেতু নিক্স মডিউল (এক্সটেনশন সহ ফাইল .nix) যে কোনও নিক্স এক্সপ্রেশন ধারণ করতে পারে, আপনি নিক্সস কনফিগারেশন ফাইল ( /etc/nixos/configuration.nix) এর ফাইলের বিষয়বস্তু হিসাবে একক নিক্স এক্সপ্রেশন থাকতে পারে বলে আশা করবেন ।
নিক্সস কনফিগারেশন ফাইলটিতে ফর্মটির একটি নিক্স এক্সপ্রেশন রয়েছে:
{config, pkgs, ...}: { /* various configuration options */ }
আপনি যদি ঘনিষ্ঠভাবে তাকান, আপনি দেখতে পাবেন এটি একটি ফাংশন , কারণ ফাংশনগুলি ফর্মটি অনুসরণ করে pattern: form। আপনি এটি দেখতে পান যে এটি একটি ফাংশন যা কোনও সেট গ্রহণ করে এবং একটি সেট প্রদান করে। উদাহরণস্বরূপ, যদি আপনার কোনও ফাংশন থাকে f = {x, y}: {a = x + y;}তবে আপনি এটি হিসাবে কল করতে পারেন f {x=1; y=2;}এবং একটি সেট ফিরে পেতে পারেন {a=3;}।
সুতরাং এর অর্থ এই যে আপনি যখন nixos-rebuild switchকল করবেন তখন কোনওটি নিক্সস কনফিগারেশন ফাইলের অভ্যন্তরে ফাংশনটিকে সেটের সাথে কল করে যাতে বৈশিষ্ট্য configএবং থাকতে হবে pkgs।
আমদানি
এর উদাহরণ অনুসরণ করে ./hardware-configuration.nix, পৃথক মডিউলে প্যাকেজগুলির তালিকাটি বের করার সহজ উপায় packages.nixহ'ল environment.systemPackagesবিকল্পটি ছিড়ে এবং বিকল্পে ./packages.nixরাখা importsoption আপনার /etc/nixos/configuration.nixমত দেখতে হবে:
{ config, ... }:
{
imports =
[ # Include the results of the hardware scan.
./hardware-configuration.nix
# Include the package list.
./packages.nix
];
# SOME STUFF
# SOME STUFF
}
আপনার /etc/nixos/packages.nixমত দেখতে হবে:
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [ emacs gitFull ];
}
ওটা কিভাবে কাজ করে? আপনি যখন চালান nixos-rebuild switch, এমন প্রক্রিয়া যা নিক্স এক্সপ্রেশনকে মূল্যায়ন করে এবং প্যাকেজ ইনস্টল করার সিদ্ধান্ত নিয়েছে এবং তাই configuration.nixবৈশিষ্ট্যগুলির একটি সেট সহ কলগুলি , যার মধ্যে কিছু রয়েছে configএবং pkgs।
এটা তোলে অ্যাট্রিবিউট খুঁজে বের করে importsফেরত সেট ভিতরে, তাই এটি মডিউল প্রতিটি তুষার অভিব্যক্তি মূল্যায়ণ importsএকই আর্গুমেন্টগুলি (সঙ্গে রয়েছে config, pkgsইত্যাদি)।
আপনার অবশ্যই pkgsকোনও ফাংশনটির কোনও যুক্তির (বা, প্রযুক্তিগতভাবে বলতে গেলে কোনও সেটের একটি বৈশিষ্ট্য, যা নিজেই একটি যুক্তি হিসাবে) থাকতে হবে packages.nix, কারণ, নিক্স ভাষার দৃষ্টিকোণ থেকে, প্রক্রিয়াটি সেটটির সাথে ফাংশনটিকে কল করতে পারে না বা নাও পারে রয়েছে pkgs। যদি এটি না হয়, আপনি চলমান অবস্থায় কোন বৈশিষ্ট্যটি উল্লেখ করবেন with pkgs?
আপনার অবশ্যই উপবৃত্ত থাকতে হবে, কারণ ফাংশনটি অন্য বৈশিষ্ট্যগুলির সাথে ডাকা হতে পারে, কেবল নয় pkgs।
কেন নয় pkgsমধ্যে configuration.nix? আপনার কাছে এটি থাকতে পারে তবে আপনি যদি ফাইলের কোথাও এটি উল্লেখ না করেন তবে আপনি নিরাপদে এটিকে বাদ দিতে পারেন, কারণ উপবৃত্তগুলি যে কোনওভাবে এগুলিকে অন্তর্ভুক্ত করবে।
একটি বাহ্যিক ফাংশন কল করে একটি বৈশিষ্ট্য আপডেট করা
অন্য উপায়টি হ'ল একটি ফাংশন করা যা কিছু অ্যাট্রিবিউট সহ একটি সেট দেয় এবং সেই বৈশিষ্ট্যের মানটি আপনি ভিতরে রেখে দেন environment.systemPackages। এটি আপনার configuration.nix:
{ config, pkgs, ... }:
{
imports =
[ # Include the results of the hardware scan.
./hardware-configuration.nix
];
# SOME STUFF
environment.systemPackages = import ./packages.nix pkgs;
# SOME STUFF
}
আপনার packages.nix:
pkgs: with pkgs; [ emacs gitFull ]
import ./packages.nix pkgsএর অর্থ: নিক্স এক্সপ্রেশনটি লোড করুন এবং ফিরিয়ে দিন ./packages.nixএবং এটি একটি ফাংশন হিসাবে এটি একটি যুক্তি দিয়ে কল করুন pkgs। with pkgs; [ emacs gitFull ]এটি একটি এক্সপ্রেশন সহ , এটি সেমিকোলনের পরে আংশিক ভাব প্রকাশের ক্ষেত্রে আংশিক ভাব প্রকাশের সুযোগ নিয়ে আসে। এটি ছাড়া, এটি হবে [ pkgs.emacs pkgs.gitFull ]।