Ein Hinweis zum Erstellen eines Programms mit Nix.
Eine Übersicht über den grundlegenden Build-Ablauf. Erstellen Sie zunächst eine Datei "default.nix" in Ihrem Projektverzeichnis.
> mkdir myproject && cd myproject
myproject> touch default.nix
Als nächstes schreiben Sie "stdenv.mkDerivation" in default.nix.
mkDerivation
ist eine Funktion, die beim Erstellen eines Pakets mit Nix verwendet wird.
default.nix
with import <nixpkgs> {};
stdenv.mkDerivation { ... }
Führen Sie nach dem Schreiben von "default.nix" den Befehl "nix-build" aus, um das Paket zu erstellen.
myproject> nix-build
Nach Abschluss des Builds befindet sich in Ihrem Projektverzeichnis ein Ordner mit dem Namen "result". Die erstellte Binärdatei usw. wird darin enthalten sein.
Erstellen Sie den folgenden C-Quellcode.
hello.c
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello, world\n");
}
default.nix
ist so geschrieben.
default.nix
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "hello";
src = ./hello.c;
buildCommand = ''
gcc -Wall -O2 -o hello $src
install -m555 -Dt $out/bin hello
'';
}
Zu diesem Zeitpunkt sieht die Struktur des Projekts folgendermaßen aus
myproject> tree
.
├── default.nix
└── hello.c
Lass uns gehen
myproject> nix-build
these derivations will be built:
/nix/store/l46b92csn5d9ics7zfs9yb51gb5n6y4r-hello.drv
building '/nix/store/l46b92csn5d9ics7zfs9yb51gb5n6y4r-hello.drv'...
/nix/store/0a3f6ddksy17jmfzasj2np999cgkrs8a-hello
Nach dem Erstellen wird das Verzeichnis "result" erstellt.
myproject> tree -l
.
├── default.nix
├── hello.c
└── result -> /nix/store/0a3f6ddksy17jmfzasj2np999cgkrs8a-hello
└── bin
└── hello
Tatsächlich ist result
ein Symbol für nix / store / 0a3f ...- hello
.
Lassen Sie uns die Binärdatei ausführen.
myproject> result/bin/hello
Hello, world
Es hat gut funktioniert.
default.nix
geschrieben stehtAlles, was Sie mit default.nix
tun, ist die Übergabe der erforderlichen Argumente an stdenv.mkDerivation
.
Das Argument von "mkDerivation" ist
name
src
buildCommand
Wurde übergeben.
name
ist der Name des Pakets und src
ist der zu erstellende Quellcode.
Schreiben Sie in buildCommand
das zum Erstellen erforderliche Shell-Skript.
In buildCommand
können Sie den Pfad, der an den Argumentschlüssel src
übergeben wird, als $ src
bezeichnen.
Außerdem enthält "$ out" den Pfad nach dem Erstellen ("/ nix / store / 0a3f ...- hallo").
default.nix
Schreiben wir die vorherige default.nix
neu, um die anderen Funktionen der mkDerivation
zu sehen.
Verwenden Sie zuerst "pname" und "version" anstelle von "name".
Dadurch wird das Paket automatisch in der Form "
deafult.nix
with import <nixpkgs> {};
stdenv.mkDerivation {
pname = "hello";
version = "0.1.0";
src = ./hello.c;
buildCommand = ...;
}
Hören Sie dann auf, "buildCommand" direkt in "default.nix" zu schreiben, und schreiben Sie das Build-Skript in eine separate Datei.
builder.sh
source $stdenv/setup
gcc -Wall -O2 -o hello $src
install -m555 -Dt $out/bin hello
Die erste Zeile, "source $ stdenv / setup", ist erforderlich, um die Build-Umgebung in Nix einzurichten.
Übergeben Sie nach dem Schreiben des Build-Skripts den Pfad des Skripts an builder
.
default.nix
with import <nixpkgs> {};
stdenv.mkDerivation {
pname = "hello";
version = "0.1.0";
src = ./hello.c;
builder = ./builder.sh;
}
Lass uns gehen
myproject> nix-build
these derivations will be built:
/nix/store/j2vxh4xm6jarf0jnm9x3sywmr1nvxdhg-hello-0.1.0.drv
building '/nix/store/j2vxh4xm6jarf0jnm9x3sywmr1nvxdhg-hello-0.1.0.drv'...
/nix/store/i8l2rmiy708sz6n486yasgzshp044kpd-hello-0.1.0
Sie können sehen, dass sich der Hash geändert hat, indem Sie default.nix neu schreiben. Der gerade erstellte Build wird nicht überschrieben, aber ein neuer Build wird in einer separaten Datei erstellt. Wenn Sie das Symbol erneut spannen, können Sie anscheinend immer zum vorherigen Build zurückkehren.
Verwenden Sie keinen lokalen Quellcode mehr und versuchen Sie, den Quellcode im Web herunterzuladen und zu erstellen. Lassen Sie uns GNU / Hallo bauen. Die Projektseite ist hier.
Verwenden Sie fetchzip
, um die Quelle herunterzuladen.
default.nix
stdenv.mkDerivation {
...
src = fetchzip {
url = "https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz";
sha256 = "1im1gglfm4k10bh4mdaqzmx3lm3kivnsmxrvl6vyvmfqqzljq75l";
};
...
}
fetchzip
lädt die komprimierte Quelle aus dem Web herunter und stellt sie lokal bereit.
Das Argument erfordert einen Hash wie "sha256" sowie "url".
Verwenden Sie den Befehl nix-prefetch-url
, um den Hash zu berechnen.
Die Option "--unpack" ist für komprimierte Dateien erforderlich.
myproject> nix-prefetch-url --unpack 'https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz'
unpacking...
[0.7 MiB DL]
path is '/nix/store/xsh1xgry2vsf6674jhc26q8k1bv4p76s-hello-2.10.tar.gz'
1im1gglfm4k10bh4mdaqzmx3lm3kivnsmxrvl6vyvmfqqzljq75l
GNU / hallo kann mit ./configure; make; make install
erstellt werden.
Für einen typischen Build wie diesen erledigt mkDerivation
das Richtige für Sie, sodass Sie builder.sh
nicht von Hand schreiben müssen.
Die gesamte Datei "default.nix" sieht folgendermaßen aus:
default.nix
stdenv.mkDerivation rec {
pname = "hello";
version = "2.10";
src = fetchzip {
url = "https://ftp.gnu.org/gnu/hello/${pname}-${version}.tar.gz";
sha256 = "1im1gglfm4k10bh4mdaqzmx3lm3kivnsmxrvl6vyvmfqqzljq75l";
};
}
Es ist ein kleines Detail, aber verwenden Sie "$ {}" für die Vervollständigung von Zeichenfolgen in Nix. Vergessen Sie nicht "rec".
Lass uns gehen
myproject> ls
default.nix
myproject> nix-build
these derivations will be built:
/nix/store/q64l9f6d29zivah3sqrxlhpw8wmz3jrk-source.drv
/nix/store/936zpfpmzxliinc69a49yn4dh67pgj6x-hello-2.10.drv
...
Das ist die grundlegende Erstellungsmethode.
Nix-Builds sind unabhängig von der Umgebung, sodass Sie sie mit nur einer "default.nix" auf jedem PC erstellen können. Ich denke, es lohnt sich, Nix nur für diesen Seelenfrieden zu verwenden.
Wenn Sie mehr über mkDerivation erfahren möchten, lesen Sie das Handbuch und Nix Pills.
Neben fetchzip
gibt es auch Funktionen zum Herunterladen der Quelle von GitHub und GitLab.
Sie werden auch im Handbuch erklärt.
Leider entwickelt sich das Nix-Handbuch noch weiter. Daher fehlt dem Handbuch noch viel Inhalt. Wenn Sie tatsächlich ein Programm auf Nix erstellen, ist die Quelle des Nixpkgs-Repositorys sehr hilfreich.
Um mkDerivation
frei zu handhaben, ist es auch gut, die Quelle von stdenv / setup
zu lesen.
Recommended Posts