কীভাবে /etc/nixos/configration.nix কে আলাদা মডিউলগুলিতে বিভক্ত করবেন?


14

ধরুন আমার কাছে খুব সাধারণ নিক্সস কনফিগারেশন ফাইল রয়েছে :

{ 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ফাইলের মধ্যে কোনও বৈধ নিক্স এক্সপ্রেশন থাকতে হবে (যেমন কোনও ফাংশন বা একটি সেট)। এর অর্থ হ'ল নিক্সস কনফিগারেশন ফাইলটি /etc/nixos/configuration.nixনিজেই একটি মডিউল, যেখানে নিক এক্সপ্রেশন থাকে।

আমি আরও জানি যে নিক্স এক্সপ্রেশনটিকে অন্য মডিউলটিতে আমি যে মডিউলটির সাথে কাজ করছি তা দৃশ্যমান করতে আমি একটি অন্তর্নির্মিত importফাংশনটি ব্যবহার করতে পারি ।

আমি সিস্টেম প্যাকেজগুলির ঘোষণাপত্রে (তালিকাটি ধারণ করে emacsএবং gitFull) এটি ফাইলের মধ্যে বিভক্ত করতে চাই packages.nix। আমি কীভাবে নিক্সস কনফিগারেশন ফাইলকে পৃথক মডিউলগুলিতে ভাগ করব?

উত্তর:


22

নিক এক্সপ্রেশন

একটি নিক্স এক্সপ্রেশন হ'ল কোনও প্রোগ্রামিং ল্যাঙ্গুয়েজ এক্সপ্রেশনের মতো: যে কোনও কিছু যা কোনও মান বা ফাংশনকে মূল্যায়ন করে। এই ক্ষেত্রে একটি মান এছাড়াও একটি তালিকা বা একটি সেট হতে পারে। যেহেতু নিক্স মডিউল (এক্সটেনশন সহ ফাইল .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এবং এটি একটি ফাংশন হিসাবে এটি একটি যুক্তি দিয়ে কল করুন pkgswith pkgs; [ emacs gitFull ]এটি একটি এক্সপ্রেশন সহ , এটি সেমিকোলনের পরে আংশিক ভাব প্রকাশের ক্ষেত্রে আংশিক ভাব প্রকাশের সুযোগ নিয়ে আসে। এটি ছাড়া, এটি হবে [ pkgs.emacs pkgs.gitFull ]


1
কীভাবে আমদানি একীভূত হয়? তারা কি পুনরাবৃত্তির আপডেট বা এর মতো কিছু ব্যবহার করে?
এআইজ

1
শর্তাধীন আমদানি করার কোনও উপায় আছে কি?
সিএমসিডিগ্রাগনকাই

1
@ সিএমসিডিগ্রাগনকাই এর মান importsমাত্র একটি তালিকা, যাতে আপনি শর্তসাপেক্ষে উপাদানগুলিকে সংযোজন করতে পারেন, যেমনimports = [ ./foo.nix ./bar.nix ] ++ (if baz then [ ./quux.nix ] else []);
ওয়ারবো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.