Ekspresi Nix
Sebuah ekspresi Nix adalah seperti ekspresi bahasa pemrograman: apapun yang mengevaluasi ke nilai atau fungsi. Nilai dalam hal ini juga bisa berupa daftar atau set. Karena modul Nix (file dengan ekstensi .nix
) dapat berisi ekspresi Nix apa pun, Anda akan mengharapkan file konfigurasi NixOS ( /etc/nixos/configuration.nix
) mengandung satu ekspresi Nix sebagai isi file.
File konfigurasi NixOS berisi ekspresi Nix dari formulir:
{config, pkgs, ...}: { /* various configuration options */ }
Jika Anda melihat lebih dekat, Anda dapat melihatnya sebagai fungsi , karena fungsi mengikuti formulir pattern: form
. Anda juga dapat melihat itu adalah fungsi yang menerima set dan mengembalikan set. Misalnya, jika Anda memiliki fungsi f = {x, y}: {a = x + y;}
, maka Anda dapat memanggilnya f {x=1; y=2;}
dan mendapatkan kembali satu set {a=3;}
.
Jadi itu berarti bahwa ketika Anda menelepon nixos-rebuild switch
, sesuatu memanggil fungsi di dalam file konfigurasi NixOS dengan set yang harus mengandung atribut config
dan pkgs
.
impor
Contoh berikut ./hardware-configuration.nix
, cara sederhana untuk mengekstrak daftar paket ke modul terpisah packages.nix
adalah dengan mencabut environment.systemPackages
opsi dan memasukkannya ./packages.nix
ke dalam imports
opsi. Anda /etc/nixos/configuration.nix
akan terlihat seperti:
{ config, ... }:
{
imports =
[ # Include the results of the hardware scan.
./hardware-configuration.nix
# Include the package list.
./packages.nix
];
# SOME STUFF
# SOME STUFF
}
Anda /etc/nixos/packages.nix
akan terlihat seperti:
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [ emacs gitFull ];
}
Bagaimana cara kerjanya? Ketika Anda menjalankan nixos-rebuild switch
, proses yang mengevaluasi ekspresi Nix dan memutuskan untuk menginstal paket dan sebagainya panggilan configuration.nix
dengan seperangkat atribut, beberapa di antaranya adalah config
dan pkgs
.
Ia menemukan atribut imports
dalam set kembali, sehingga mengevaluasi setiap ekspresi Nix dalam modul yang imports
berisi dengan argumen yang sama ( config
, pkgs
, dll).
Anda harus memiliki pkgs
sebagai argumen (atau, secara teknis, atribut dari himpunan, yang dengan sendirinya merupakan argumen) dari suatu fungsi dalam packages.nix
, karena, dari perspektif bahasa Nix, proses tersebut mungkin atau mungkin tidak memanggil fungsi dengan himpunan yang berisi pkgs
. Jika tidak, atribut apa yang akan Anda rujuk, saat berjalan with pkgs
?
Anda juga harus memiliki ellipsis, karena fungsinya mungkin dipanggil dengan atribut lain, bukan hanya pkgs
.
Kenapa tidak ada pkgs
di sana configuration.nix
? Anda dapat memilikinya, tetapi jika Anda tidak merujuknya di mana pun dalam file, Anda dapat dengan aman menghilangkannya, karena ellipsis akan memasukkannya.
Memperbarui atribut dengan memanggil fungsi eksternal
Cara lain adalah dengan membuat fungsi yang mengembalikan set dengan beberapa atribut, dan nilai atribut yang akan Anda masukkan ke dalamnya environment.systemPackages
. Ini milikmu 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
}
Anda packages.nix
:
pkgs: with pkgs; [ emacs gitFull ]
import ./packages.nix pkgs
berarti: memuat dan mengembalikan ekspresi Nix ke dalam ./packages.nix
dan karena itu adalah fungsi, sebut saja dengan argumen pkgs
. with pkgs; [ emacs gitFull ]
adalah dengan-ekspresi , ini membawa ruang lingkup ekspresi sebelum titik koma ke ekspresi setelah titik koma. Tanpa itu, itu akan menjadi [ pkgs.emacs pkgs.gitFull ]
.
imports
hanyalah sebuah daftar, sehingga Anda dapat menambahkan elemen ke kondisi tersebut, misalnyaimports = [ ./foo.nix ./bar.nix ] ++ (if baz then [ ./quux.nix ] else []);