ห้ามใช้นิพจน์
แสดงออกห้ามเป็นเช่นใด ๆ แสดงออกการเขียนโปรแกรมภาษา: อะไรที่ประเมินค่าหรือฟังก์ชั่น ค่าในกรณีนี้ยังสามารถเป็นรายการหรือชุด เนื่องจากโมดูล Nix (ไฟล์ที่มีส่วนขยาย.nix
) สามารถมีนิพจน์ Nix ใด ๆ คุณจะคาดหวังว่าไฟล์กำหนดค่า NixOS ( /etc/nixos/configuration.nix
) จะมีนิพจน์ Nix เดียวเป็นเนื้อหาไฟล์
ไฟล์คอนฟิกูเรชัน NixOS มีนิพจน์ห้ามของฟอร์ม:
{config, pkgs, ...}: { /* various configuration options */ }
ถ้าคุณมองอย่างใกล้ชิดคุณจะเห็นว่ามันเป็นฟังก์ชั่นpattern: form
เพราะฟังก์ชั่นเป็นไปตามรูปแบบ นอกจากนี้คุณยังสามารถเห็นว่ามันเป็นฟังก์ชั่นที่รับชุดและส่งคืนชุด เช่นถ้าคุณมีฟังก์ชั่นf = {x, y}: {a = x + y;}
คุณก็สามารถเรียกมันเป็นf {x=1; y=2;}
และกลับมาตั้งค่า{a=3;}
ได้
ดังนั้นวิธีการที่ว่าเมื่อคุณโทรหาnixos-rebuild switch
บางสิ่งบางอย่างเรียกฟังก์ชันภายในแฟ้มการกำหนดค่า NixOS กับชุดที่จะต้องมีคุณลักษณะและconfig
pkgs
การนำเข้า
ตัวอย่างต่อไปนี้./hardware-configuration.nix
วิธีง่าย ๆ ในการแตกรายการแพ็กเกจลงในโมดูลแยกpackages.nix
เป็นเพียงการคัดลอกenvironment.systemPackages
ตัวเลือกออกและใส่./packages.nix
เข้าไปในimports
ตัวเลือก คุณ/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
เป็นwith-expressionมันนำขอบเขตของการแสดงออกก่อนเซมิโคลอนไปยังนิพจน์หลังจากเซมิโคลอน ไม่ว่ามันจะเป็นpkgs
with pkgs; [ emacs gitFull ]
[ pkgs.emacs pkgs.gitFull ]