निक्स के भाव
एक Nix अभिव्यक्ति किसी भी प्रोग्रामिंग भाषा की अभिव्यक्ति की तरह है: ऐसा कुछ भी जो किसी मान या फ़ंक्शन का मूल्यांकन करता है। इस मामले में एक मूल्य एक सूची या एक सेट भी हो सकता है। निक्स मॉड्यूल के रूप में (विस्तार के साथ फाइल .nix
) में कोई भी Nix अभिव्यक्ति हो सकती है, आप NixOS कॉन्फ़िगरेशन फ़ाइल (/etc/nixos/configuration.nix
) को एक निक्स अभिव्यक्ति के रूप में इसकी फाइल सामग्री में शामिल करने की करेंगे।
NixOS कॉन्फ़िगरेशन फ़ाइल में प्रपत्र की एक 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
में डालना imports
है। आपकी /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 ]
।