/Etc/nixos/configuration.nix dosyasını ayrı modüllere nasıl bölebilirim?


14

Çok basit bir NixOS yapılandırma dosyasına sahip olduğumu varsayalım :

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

NixOS'un bir modül sistemi uyguladığını ve bir modülün bir .nixdosya olduğunu biliyorum . Her .nixdosya geçerli bir Nix ifadesi içermelidir (örneğin bir işlev veya küme). Bu, NixOS yapılandırma dosyasının /etc/nixos/configuration.nixkendisinin bir Nix ifadesi içeren bir modül olduğu anlamına gelir .

Ayrıca, başka bir modüldeki Nix ifadesini çalıştığım modüle görünür hale getirmek için yerleşik bir importişlev kullanabileceğimi biliyorum .

Ben sistem paketleri (içeren liste emacsve içeren gitFull) dosyaya bölmek istiyorum packages.nix. NixOS yapılandırma dosyasını ayrı modüllere nasıl bölebilirim?

Yanıtlar:


22

Nix ifadeleri

Bir Nix ifadesi herhangi bir programlama dili ifadesi gibidir: şey bir değer ya da bir işleve değerlendirir. Bu durumda bir değer bir liste veya küme de olabilir. Nix modülü (uzantılı dosya .nix) herhangi bir Nix ifadesi içerebileceğinden, NixOS yapılandırma dosyasının ( /etc/nixos/configuration.nix) dosya içeriği olarak tek bir Nix ifadesi içermesini beklersiniz .

NixOS yapılandırma dosyası, formun Nix ifadesini içerir:

{config, pkgs, ...}: { /* various configuration options */ }

Yakından bakarsanız, bunun bir işlev olduğunu görebilirsiniz , çünkü işlevler formu takip eder pattern: form. Ayrıca, bir kümeyi kabul eden ve bir kümeyi döndüren bir işlev olduğunu görebilirsiniz. Örneğin, eğer bir fonksiyonunuz varsa f = {x, y}: {a = x + y;}, o zaman onu çağırabilir f {x=1; y=2;}ve bir set geri alabilirsiniz {a=3;}.

Yani, aradığınızda nixos-rebuild switch, bir şey NixOS yapılandırma dosyasının içindeki işlevi öznitelikler configve içermesi gereken kümeyle çağırır pkgs.

ithalat

Örnek takiben ./hardware-configuration.nix, ayrı bir modül içine paketlerin listesini çıkarmak için basit bir yolu packages.nixsadece rip etmektir environment.systemPackagesve koyun dışında seçeneği ./packages.nixhaline importsseçeneği. Sizin /etc/nixos/configuration.nixgibi görünecektir:

{ config, ... }:    
{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
      # Include the package list.
      ./packages.nix
    ];
  # SOME STUFF
  # SOME STUFF
}

Sizin /etc/nixos/packages.nixgibi görünecektir:

{ pkgs, ... }:
{
  environment.systemPackages = with pkgs; [ emacs gitFull ];
}

Bu nasıl çalışıyor? Eğer çalıştırdığınızda nixos-rebuild switch, Nix ifadeleri değerlendirir ve aramaları paketleri ve böylece yüklemeye karar süreci configuration.nixbunlardan bazıları niteliklerini, bir dizi configve pkgs.

Bu özellik bulur importso modüllerin her Nix ifadeyi değerlendirir, böylece döndürülen kümesi içindeki importsaynı argümanları ile (içerir config, pkgsvs).

Sen olmalıdır pkgsbir fonksiyonun (teknik, kendisi de bir argüman olan bir dizi, bir niteliğinin konuşan ya) bağımsız değişken olarak packages.nixbir Nix dil açısından, süreç veya sette bununla işlevi çağırmak olabilir veya olmayabilir, çünkü, içerir pkgs. Değilse, çalışırken hangi özelliğe başvurursunuz with pkgs?

Ayrıca üç noktaya da sahip olmalısınız, çünkü işlev yalnızca özelliklerle değil, diğer niteliklerle de çağrılabilir pkgs.

Neden yok pkgsiçinde configuration.nix? Buna sahip olabilirsiniz, ancak dosyada herhangi bir yere başvurmazsanız, üç nokta da onları içereceği için güvenle atlayabilirsiniz.

Harici bir işlevi çağırarak bir özniteliği güncelleme

Başka bir yol, sadece bazı öznitelikli bir küme ve içine koyacağınız özniteliğin değerini döndüren bir işlev yapmaktır environment.systemPackages. Bu sizin 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
}

Sizin packages.nix:

pkgs: with pkgs; [ emacs gitFull ]

import ./packages.nix pkgsşu anlama gelir: Nix ifadesini yükleyip döndürün ./packages.nixve bir işlev olduğu için, bir argümanla çağırın pkgs. with pkgs; [ emacs gitFull ]bir -ifade ile , noktalı virgül öncesi ifadenin kapsamını noktalı virgül sonrası ifadeye getirir. O olmasaydı olurdu [ pkgs.emacs pkgs.gitFull ].


1
İthalat nasıl birleştirilir? RecursiveUpdate veya benzeri bir şey kullanıyorlar mı?
aij

1
Koşullu ithalat yapmanın bir yolu var mı?
CMCDragonkai

1
@CMCDragonkai değeri importssadece bir listedir, bu nedenle koşullu olarak öğeler ekleyebilirsiniz, örneğinimports = [ ./foo.nix ./bar.nix ] ++ (if baz then [ ./quux.nix ] else []);
Warbo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.