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 config
ve 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.nix
sadece rip etmektir environment.systemPackages
ve koyun dışında seçeneği ./packages.nix
haline imports
seçeneği. Sizin /etc/nixos/configuration.nix
gibi 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.nix
gibi 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.nix
bunlardan bazıları niteliklerini, bir dizi config
ve pkgs
.
Bu özellik bulur imports
o modüllerin her Nix ifadeyi değerlendirir, böylece döndürülen kümesi içindeki imports
aynı argümanları ile (içerir config
, pkgs
vs).
Sen olmalıdır pkgs
bir fonksiyonun (teknik, kendisi de bir argüman olan bir dizi, bir niteliğinin konuşan ya) bağımsız değişken olarak packages.nix
bir 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 pkgs
iç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.nix
ve 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 ]
.