summaryrefslogtreecommitdiff
path: root/3 resources/nix
diff options
context:
space:
mode:
authorJasper Ras <jras@hostnet.nl>2025-01-08 10:48:09 +0100
committerJasper Ras <jras@hostnet.nl>2025-01-08 10:48:09 +0100
commited0753ad224f0c65133bd7a63180257eecd9f5e3 (patch)
treecc662868574fe17db58be9e0faadd452c84dc59c /3 resources/nix
parent493be30dc981eaf762a95a1218f96893b1976727 (diff)
vault backup: 2025-01-08 10:48:09
Diffstat (limited to '3 resources/nix')
-rw-r--r--3 resources/nix/flakes.md19
-rw-r--r--3 resources/nix/language.md5
-rw-r--r--3 resources/nix/language/keyword-import.md2
-rw-r--r--3 resources/nix/language/keyword-let.md9
-rw-r--r--3 resources/nix/language/keyword-rec.md17
-rw-r--r--3 resources/nix/language/keyword-with.md12
-rw-r--r--3 resources/nix/overlays.md8
-rw-r--r--3 resources/nix/package.md3
-rw-r--r--3 resources/nix/packages/apply-patches.md14
-rw-r--r--3 resources/nix/repl.md2
-rw-r--r--3 resources/nix/shell.nix.md39
11 files changed, 130 insertions, 0 deletions
diff --git a/3 resources/nix/flakes.md b/3 resources/nix/flakes.md
new file mode 100644
index 0000000..fb99500
--- /dev/null
+++ b/3 resources/nix/flakes.md
@@ -0,0 +1,19 @@
+Nix flakes are source trees containing a file `flake.nix` at their root. The file `flake.nix` provides a standardized way to provide [[Zettelkast/Index/Nix]] artifacts. It's like a package manager for [[Zettelkast/Index/Nix]]. A flake can be dependent on other Flakes and it's possible to pin dependencies to exact revisions by using a `flake.lock` file.
+
+Nix flake evaluation is hermetic, meaning that it produces the same result wherever it's built.k
+
+The feature can be enabled in `~/.config/nix/nix.conf`:
+
+```
+experimental-features = nix-command flakes
+```
+
+To initialize in a repo: `nix flake init`.
+
+In flakes dependencies have to be specified explicitly and MUST be locked to specific versions therefore it's no longer allowed to use the nixpkgs found in `NIX_PATH` by referencing it like `<nixpkgs>`.
+
+Output of a Flake is an arbitrary [[Zettelkast/Index/Nix]] value such as a package, [[NixOS]] module or library function.
+Commands `nix build` and `nix shell` will build the output `packages.<system>.default` unless we specify another output, for example: `nix shell .#checks.aarch64-linux.build`.
+
+---
+[Flakes Wiki](https://nixos.wiki/wiki/Flakes) \ No newline at end of file
diff --git a/3 resources/nix/language.md b/3 resources/nix/language.md
new file mode 100644
index 0000000..01101d9
--- /dev/null
+++ b/3 resources/nix/language.md
@@ -0,0 +1,5 @@
+"Nix is like JSON, but with functions".
+
+[[keyword-rec]]
+[[keyword-let]]
+[[keyword-with]]
diff --git a/3 resources/nix/language/keyword-import.md b/3 resources/nix/language/keyword-import.md
new file mode 100644
index 0000000..616c155
--- /dev/null
+++ b/3 resources/nix/language/keyword-import.md
@@ -0,0 +1,2 @@
+The import keyword brings a Nix expression from another source into scope such that we can reference it. For example, we can `import <nixpkgs>` and it would bring the entire attribute set that is Nixpkgs into scope and allows us to reference any of its attributes.
+
diff --git a/3 resources/nix/language/keyword-let.md b/3 resources/nix/language/keyword-let.md
new file mode 100644
index 0000000..3b2f401
--- /dev/null
+++ b/3 resources/nix/language/keyword-let.md
@@ -0,0 +1,9 @@
+Keyword: `let`
+Used to assign variables that can be used in an expression immediately following the let-binding.
+```nix
+let
+ one = 1;
+in {
+ two = one + 1;
+}
+```
diff --git a/3 resources/nix/language/keyword-rec.md b/3 resources/nix/language/keyword-rec.md
new file mode 100644
index 0000000..456f877
--- /dev/null
+++ b/3 resources/nix/language/keyword-rec.md
@@ -0,0 +1,17 @@
+Recursive attribute sets can reference values declared earlier in the same set.
+keyword: `rec`
+```nix
+rec {
+ one = 1;
+ two = one + 1;
+}
+```
+
+Ordering does not matter:
+```nix
+nix-repl> rec { two = one + 1; one = 1; }
+{
+ one = 1;
+ two = 2;
+}
+```
diff --git a/3 resources/nix/language/keyword-with.md b/3 resources/nix/language/keyword-with.md
new file mode 100644
index 0000000..10763ff
--- /dev/null
+++ b/3 resources/nix/language/keyword-with.md
@@ -0,0 +1,12 @@
+The `with` keyword brings all attributes from a given set, e.g nixpkgs, into the local scope. Making them accessible as if they were declared in the same file.
+
+An example, bringing everything from nixpkgs into scope:
+```
+with import <nixpkgs>;
+with python310Packages; <-- declared in nixpkgs
+
+buildPythonPackage <-- declared in python310Packages
+```
+
+The import statement is required here because imports a nix expression from another source, in this case nixpkgs.
+It is not required at line two, because python310Packages itself is already in the local scope. \ No newline at end of file
diff --git a/3 resources/nix/overlays.md b/3 resources/nix/overlays.md
new file mode 100644
index 0000000..70dad85
--- /dev/null
+++ b/3 resources/nix/overlays.md
@@ -0,0 +1,8 @@
+Functions that accept two args (conventionally: final, prev) and return a set of [[package]]s.
+
+The `prev` arguments holds the set of packages of the "parent" overlay while the `final` argument holds the end result of **all** overlays applied. This means that overlays depend on each other. It is unclear how we can tell on which overlay an overlay depends.
+
+We can use it to override existing packages or add new packages.
+
+---
+https://nixos.wiki/wiki/Overlays
diff --git a/3 resources/nix/package.md b/3 resources/nix/package.md
new file mode 100644
index 0000000..231e3a6
--- /dev/null
+++ b/3 resources/nix/package.md
@@ -0,0 +1,3 @@
+Packages != NixOS Modules
+
+Packages are from Nixpkgs. \ No newline at end of file
diff --git a/3 resources/nix/packages/apply-patches.md b/3 resources/nix/packages/apply-patches.md
new file mode 100644
index 0000000..e703f81
--- /dev/null
+++ b/3 resources/nix/packages/apply-patches.md
@@ -0,0 +1,14 @@
+We can apply patches to existing packages using [[overlays]]:
+```nix
+final: prev {
+ nova = prev.nova.overrideAttrs (old: {
+ patches = (old.patches or []) ++ [
+ prev.fetchpatch {
+ url = "https://github.com/owner/repo/commit/hash.patch";
+ hash = "somehash";
+ })
+ ./relative.patch
+ ]
+ })
+}
+```
diff --git a/3 resources/nix/repl.md b/3 resources/nix/repl.md
new file mode 100644
index 0000000..6a0fd4a
--- /dev/null
+++ b/3 resources/nix/repl.md
@@ -0,0 +1,2 @@
+`nix repl` to interactively evaluate Nix expressions. `:p` if output is not full.
+ `nix-instantiate --eval <file>.nix` to evaluate a Nix expression from a file. `--strict`. \ No newline at end of file
diff --git a/3 resources/nix/shell.nix.md b/3 resources/nix/shell.nix.md
new file mode 100644
index 0000000..d5fa8ce
--- /dev/null
+++ b/3 resources/nix/shell.nix.md
@@ -0,0 +1,39 @@
+Can be used to set up per dir environments, e.g using direnv to automatically activate them.
+## Python
+https://nixos.org/manual/nixpkgs/stable/#python
+
+```nix
+{ pkgs ? import <nixpkgs> {}}:
+
+pkgs.mkShell {
+ packages = [ pkgs.virtualenv ];
+}
+```
+
+```nix
+with import <nixpkgs> {};
+let
+ my_toolz = python311.pkgs.buildPythonPackage rec {
+ pname = "toolz";
+ version = "0.10.0";
+ pyproject = true;
+ src = fetchPypi {
+ inherit pname version;
+ hash = "sha256-CP3V73yWSArRHBLUct4hrNMjWZlvaaUlkpm1QP66RWA=";
+ };
+ nativeBuildInputs = [
+ python311.pkgs.setuptools
+ python311.pkgs.wheel
+ ]; # has no tests
+ doCheck = false;
+ meta = {
+ homepage = "https://github.com/pytoolz/toolz/";
+ description = "List processing tools and functional utilities";
+ # [...]
+ };
+ };
+in python311.withPackages (ps: with ps; [ numpy my_toolz ]) ).env
+```
+
+The [[keyword-import]] is required here because imports a nix expression from another source, in this case nixpkgs.
+It is not required at line two, because python310Packages itself is already in the local scope. \ No newline at end of file