Hier sind meine Nix Flakes gespeichert für verschiedene Entwicklungsumgebungen im Studium. Java und IntelliJ benutze ich auf Windows, das Nix ist auf wsl.
- WSL Terminal öffnen (wenn auf Windows mit WSL)
- curl -L https://nixos.org/nix/install | sh
- nach installation meldung beachten: . /home/jf/.nix-profile/etc/profile.d/nix.sh (erstellt Umgebungsvariable)
- nix --version sollte funktionieren
Updaten: https://nix.dev/manual/nix/2.18/installation/upgrading
Alternativer Download (Multiuser wird empfohlen) : nixos.org/download
mkdir -p /etc/nix
echo "experimental-features = nix-command flakes" > ~/.config/nix/nix.confkonfigurieren nach Installation: /etc/nix/nix.conf file (auf wsl, nicht im windows. Wenn Ordner und Datei nicht vorhanden, sie selber erstellen!)
cd /etc
sudo mkdir nix
sudo touch nix.conf
# Die Datei muss diese Zeile enthalten:
experimental-features = nix-command flakesDatei anpassen Beispiel
sudo chown jf /etc/nix/nix.conf
code /etc/nix/nix.conf
--extra-experimental-features nix-commandnix run nixpkgs#hello🥳
"nix " ist ein flakes Befehl. "nix/ ..." ist der originale alte Weg (hier nicht genutzt).
Ich nutze Flake Nix mit Dev Environments.
Gehe in den Ordner mit dieser flake.nix Datei und führe dort diese Befehle aus (Beispiel: cd /mnt/c/Users/jf/code/wsl/nix)
nix develop
nix develop .#flakeShell
nix develop .#dotnet
nix develop .#web1
Praktischer mit nix-direnv. Informationen zur mkShell.
flake.nix beim 1. Mal generieren (oder von hier kopieren)
nix flake new <name vom flake>
oder erstelle flake mit default settings:
nix flake init
nix flake init --template github:omega-800/devshell-templates#<template>
nix flake init -t github:hercules-ci/flake-parts
- flake.lock wird automatisch erstellt
- Git benutzen und bei Änderungen mindestens git add ausführen.
Nix Sprache prüfen mit
nix eval .
nix search <> # package suchen, nix search <flake> ..
# test ohne permanente installation
nix run
# build kompiliert nicht immer neu, wenn vorhanden nimmt es das aus dem "Cache"
nix shell (packages..)
nix build
nix build nixpkgs#hello
# nix shell, nix run, nix build sind zum testen und daten können wieder weggehen (ad hoc). nix profile benutzen wenn es bleiben soll.
nix profile
nix profile list
nix profile add nixpkgs#jetbrains.webstorm
nix profile remove nixpkgs#jetbrains.webstormnix eval --expr '1 + 2' nix eval --file example.nix { … }
im nix repl: (nix-repl>) 1. :load datei.nix 2. description "test"
Package ist z.B. Programmiersprache oder Programm. Die NixOS Packages sind die gleichen wie die für Flakes.
nix search nixpkgs <name>
oder ich bevorzuge: https://search.nixos.org/packages
Das ist die Einschränkung von nix, es wird nicht empfohlen von Nix Herstellern...
- Kann nicht package mit gewisser Versionsnummern auswählen
- Schwierig ein Package einzeln zu aktualisieren
-
Workaround: 2 nixpackages einrichten (alt und neu) : im devshell die nixpkgs mischen / auswählen ODER irgendwie mit overlays
-
Workaround
package mit versionsnummer (hash/nixpkgs reference) auswählen z.B. hier: https://www.nixhub.io/ https://lazamar.co.uk/nix-versions/
Dokumentation stdenv Dokumentation mkShell
mkShell pkgs.mkShell is a specialized stdenv.mkDerivation that removes some repetition when using it with nix-shell (or nix develop).
stdenv standard library for nix builds
mkDerivation (mk wegen mk für makefile)
packages = nativeBuildInputs
Standardmässig das "packages" Attribut benutzen.
Bei stdenv werden die dependencies von packages im "buildInputs" Attribut definiert. " This attribute ensures that the bin subdirectories of these packages appear in the PATH environment variable during the build, that their include subdirectories are searched by the C compiler, and so on. (See the section called “Package setup hooks” for details.) " Quelle
Beispiel aus der Doku
stdenv.mkDerivation {
pname = "libfoo"; # pname schreiben statt name
version = "1.2.3";
# ...
buildInputs = [
libbar
perl
ncurses
];
}Beispiel von meiner Shell mit mkShell
# nix develop .#dotnet (.NET)
dotnet = pkgs.mkShell {
packages = with pkgs; [
jetbrains.rider
dotnetCorePackages.sdk_8_0_3xx-bin
];
shellHook = ''
echo ""
echo "C#"
echo "rider ."
echo ""
'';
};Flakes werden mit der nix sprache geschrieben. Es ist eine funktionale Programmiersprache (wie Haskell).
Es gibt currying und hat einen speziellen Syntax. Aber types gibt es gar nicht, auch nicht im Hintergrund.
Beispiel: outputs function of inputs… output = {..}: {packages.. = nixpkgs…}; nix build .#test (. = aktueller ordner)
Nix language https://nix.dev/manual/nix/2.28/language/
dictionary, key value attribute set https://nix.dev/tutorials/nix-language.html#attribute-set
Zeilen mit ; beenden, mehrzeilig mit '' .. \n .. \n .. ''
function mit : geschrieben, outputs = {self, nixpkgs }: { … };
[1 2 3] // Liste mit Abstand
{ lib, stdenv, fetchurl } // argumente mit komma
{ string = "hello"; integer = 1; } // attribute set mit semikolon
rec {} : steht für recursive, es ist ein recursives attribute set. Kann auch mit let in geschrieben werden. let definiert lokale Variable.
bei let die lokalen Variablen definieren und in in benutzen .
positional arguments : Reihenfolge von Argumenten relevant
let sum = arg1: arg2: arg1 + arg2; add1 = sum 1; in add1 2 //mit semikolon?
geschweifte klammern weil es ein argument set ist let sum = {arg1, arg2 ? 2 }: arg1 + arg2; in sum {arg1 = 1; }
inputs.nixpkgs.url = ist ein verkettetes attribute set…
nix != nixos != nixospkgs → nicht verwechseln, gehören alle zu Nix.
nixpkgs : nixos/nixpkgs, https://github.com/nixos/nixpkgs
pkgs ist eigentlich "nix packages and functions"
attribute path = z.B. legacyPackages.x86_..-linux... legacyPackages ist hier normal.
substitutor : cache der build ersetzt wenn vorhanden
library / framework : library you call and framework calls you. die definierte "Variable/attribute set" im outputs wird aufgeruft (also wie framework)
/nix/store hat wichtige Dateien
Beispiel Flakes
Dokumentation
Einrichtung Tutorials
- https://www.kunxi.org/blog/2020/11/nix-on-wsl/
- https://garnix.io/docs/installing-nix
- https://discourse.nixos.org/t/first-time-user-where-should-i-create-my-nix-conf/39655
- https://dev.to/arnu515/getting-started-with-nix-and-nix-flakes-mml
- https://tech.aufomm.com/my-nix-journey-use-nix-with-ubuntu/
- https://nix.dev/manual/nix/2.18/quick-start
Interessantes
Damit nicht jedes Mal im Nix Ordner nix develop .#<> manuell aufgerufen werden und dann zum Projektordner gewechselt muss. Direnv ruft automatisch Befehle im dazugehörigen Ordner auf, mit nix-direnv ist direnv für nix optimiert.
Installation von nix-direnv mit nix-home-manager (Home-manager Notizen)
Die Datei .envrc im gewünschten Projektordner erstellen und diese Zeile schreiben (Ordner muss auf Nix Flake Ordner zeigen, #devShell anpassen)
use flake /mnt/c/Users/jf/code/wsl/nix/#<devShell>
💡 Die Warnung, dass es länger lädt, ignorieren (ausser es lädt wirklich zu lange).
Wenn aufgefordert ausführen.
direnv allow
Oder permanent setzen in ~/.config/direnv/direnv.toml
[whitelist]
prefix = [ "~/wsl-code/ost_3_semester", "~/loremipsum" ]
Nix-direnv verhindert "Garbage Collection" von Nix, was machen wenn Dev Environment wahrscheinlich nicht mehr benötigt wird? (muss noch getestet werden)
- .direnv Ordner löschen und manuell Garbage Collection starten
- nix-collect-garbage --delete-old --dry-run --delete-older-than 30d
Packages die nützlich sind kann man auch ohne Flake benutzen. Wenn Packages selten oder zum Testen benötigt werden sehr praktisch. So muss keine Flake (mit flake.nix) Datei angepasst werden.
nix-shell --packages <Packetname>
nix-shell -p <Packetname>
nix-env --install --attr nixpkgs.<Packetname>
nix-env --uninstall <Packetname>
Updated alle installierten Packages (auch die von flake?) nix-channel --update nixpkgs nix-env --upgrade '*'
Rückgängig (1 nix-env command) nix-env --rollback
nix-collect-garbage --delete-old
- ruby_3_4 (gem Umgebungsvariable)
- obsidian
- Wie Internetzugang sperren?
- VS Code extensions auch einrichten mit nix flakes?
in WSL mit nix:
# .envrc: use flake /mnt/c/Users/jf/code/wsl/nix/#uml
# oder nix develop .#uml
# Projektordner ist auf windows gespeichert
cd /mnt/c/Users/jf/code/studium/ost_3_semester/sep1/uml
plantuml
- Auf die gewünschte .puml Datei im plantuml viewer doppelklicken
- vs code nebenbei öffnen (in windows oder wsl), die gleiche Datei bearbeiten
- Tipp: die offizielle plantuml vscode extension nutzen für korrekten Syntax
code . --remote
# oder so:
code . --remote wsl+Ubuntu
Eine executable in wsl heisst nicht .exe sondern hat keine Endung ausführen mit: ./HelloWorld