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 ].