अलग मॉड्यूल में /etc/nixos/configuration.nix को कैसे विभाजित करें?


14

मान लीजिए कि मेरे पास एक बहुत ही सरल NixOS विन्यास फाइल है :

{ config, pkgs, ... }:    
{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
    ];
  # SOME STUFF
  environment.systemPackages = with pkgs; [ emacs gitFull ];
  # SOME STUFF
}

मुझे पता है कि निक्सओएस एक मॉड्यूल सिस्टम लागू करता है , और एक मॉड्यूल एक .nixफाइल है। हर .nixफ़ाइल में कोई भी मान्य Nix अभिव्यक्ति (जैसे एक फ़ंक्शन या एक सेट) होना चाहिए । इसका मतलब है कि निक्सोस कॉन्फ़िगरेशन फ़ाइल/etc/nixos/configuration.nix अपने आप में एक मॉड्यूल है, जिसमें निक्स अभिव्यक्ति है।

मुझे यह भी पता है कि मैं जिस मॉड्यूल के साथ काम कर रहा हूं, उसके लिए एक अन्य मॉड्यूल में निक्स अभिव्यक्ति बनाने के लिए, मैं एक अंतर्निहित फ़ंक्शन का उपयोग कर सकता हूंimport

मैं फ़ाइल में सिस्टम संकुल (सूची युक्त emacsऔर gitFull) की घोषणा को विभाजित करना चाहता हूं packages.nix। मैं NixOS कॉन्फ़िगरेशन फ़ाइल को अलग-अलग मॉड्यूल में कैसे विभाजित करूं?

जवाबों:


22

निक्स के भाव

एक 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और जैसा कि यह एक फ़ंक्शन है, इसे एक तर्क के साथ कॉल करें pkgswith pkgs; [ emacs gitFull ]एक अभिव्यक्ति है , यह अर्धविराम से पहले अभिव्यक्ति के दायरे को अर्धविराम के बाद अभिव्यक्ति में लाता है। इसके बिना, यह होगा [ pkgs.emacs pkgs.gitFull ]


1
आयात कैसे मर्ज किए जाते हैं? क्या वे recursiveUpdate का उपयोग करते हैं या ऐसा कुछ करते हैं?
ऐज

1
क्या सशर्त आयात करने का कोई तरीका है?
CMCDragonkai

1
@CMCDragonkai का मान importsसिर्फ एक सूची है, इसलिए आप तत्वों को सशर्त रूप से जोड़ सकते हैं, जैसेimports = [ ./foo.nix ./bar.nix ] ++ (if baz then [ ./quux.nix ] else []);
वारबो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.