git.iko.soy/typeable/nix-pills-ru
on master help sign in
.gitignore+2−2
since splitsnapshots
unifiedsplit
@@ -1,5 +1,5 @@
1−nix.pdf
1+presentation.pdf
2−nix.html
2+presentation.html
3speaker-notes.md
3speaker-notes.md
4speaker-notes.html
4speaker-notes.html
5images/graphviz*
5images/graphviz*
Makefile+12−7
@@ -1,10 +1,15 @@
1−nix.pdf: ; pandoc nix.md -t beamer --slide-level=2 --pdf-engine xelatex -F pandoc-filter-graphviz -o nix.pdf
1+all: presentation.pdf presentation.html speaker-notes.html
2−nix.html: ; pandoc nix.md -t slidy -F pandoc-filter-graphviz -o nix.html;
2+.PHONY : all
3−speaker-notes.md: ; sed -e "/<!--/,/-->/!d" nix.md | sed -e "s/<!--//" | sed -e "s/-->/\n\* \* \*/" > speaker-notes.md
4−speaker-notes.html: speaker-notes.md; pandoc speaker-notes.md -o speaker-notes.html
5
3
6−build: nix.pdf nix.html speaker-notes.html
7
4
5+.PHONY: autoreload
8−autoreload: ; while inotifywait -qq nix.md; do $MAKE build; done
6+autoreload: ; while sleep 1; do make --no-print-directory -s; done
7+
8+
9+%.pdf: %.md; pandoc $< -t beamer --slide-level=2 --pdf-engine xelatex -F pandoc-filter-graphviz -o $@
10+%.html: %.md; pandoc $< -t slidy -F pandoc-filter-graphviz -o $@;
11+
12+
13+speaker-notes.md: presentation.md; sed -e "/<!--/,/-->/!d" nix.md | sed -e "s/<!--//" | sed -e "s/-->/\n\* \* \*/" > speaker-notes.md
14+
9
15
10−all: build
README.md+8−4
@@ -1,9 +1,13 @@
1# Nix pills in russian
1# Nix pills in russian
2
2
3−This repo contains a presentation about nix based on the wonderful [nix-pills](https://nixos.org/nixops/nix-pills).
3+This repo contains a presentation about nix based on the wonderful [nix-pills](https://nixos.org/nixos/nix-pills).
4
4
5−Markdown document is located [here](./nix.md)
5+Markdown document is located [here](./presentation.md).
6
6
7−To build a PDF presentation and speaker's notes in HTML, run `nix-shell`
7+PDF is located in the ["releases" tab in github repo](https://github.com/typeable/nix-pills-ru/releases).
8
8
9+To enter an environment with all the needed packages, run `nix-shell`.
10+
11+To build PDF of the presentation and speaker's notes, run `make` (either after installing `pandoc`, `pandoc-filter-graphviz` and `graphviz` or from within the `nix-shell`).
12+
9−To start automatic regeneration of aforementioned build artifacts, run `nix-shell --run make`
13+To start automatic regeneration of aforementioned files, run `make autoreload`.
default.nix−4
@@ -19,8 +19,6 @@ in stdenv.mkDerivation rec {
19 hack-font
19 hack-font
20 graphviz
20 graphviz
21 dot2tex
21 dot2tex
22−
23− inotify-tools
24 ];
22 ];
25
23
26 src = ./.;
24 src = ./.;
@@ -28,6 +26,4 @@ in stdenv.mkDerivation rec {
28 phases = [ "buildPhase" ];
26 phases = [ "buildPhase" ];
29
27
30 preferLocalBuild = true;
28 preferLocalBuild = true;
31−
32− shellHook = "make build";
33}
29}
nix.md → presentation.mdrenamed+78−22
@@ -39,6 +39,8 @@ header-includes:
39
39
40Вы можете прекратить слушать после любой секции, и я надеюсь, что вы унесете какую-то полезную для себя информацию.
40Вы можете прекратить слушать после любой секции, и я надеюсь, что вы унесете какую-то полезную для себя информацию.
41
41
42+Исходники, собранный pdf и заметки докладчика для этой презентации находятся на <https://github.com/typeable/nix-pills-ru>
43+
42
44
43<!--
45<!--
44Как вы все скорее всего знаете, мы используем Nix для сборки и тестирования нашего кода. Я, Александр Бантьев (@balsoft) отвечаю за инфраструктуру сборки пакетов (Hydra, NixOps), а также за поддержание инструкций сборки в актуальном состоянии. Я бы хотел рассказать вам про nix с помощью вольного пересказа отличной серии статей ["Nix pills"](https://nixos.org/nixos/nix-pills)
46Как вы все скорее всего знаете, мы используем Nix для сборки и тестирования нашего кода. Я, Александр Бантьев (@balsoft) отвечаю за инфраструктуру сборки пакетов (Hydra, NixOps), а также за поддержание инструкций сборки в актуальном состоянии. Я бы хотел рассказать вам про nix с помощью вольного пересказа отличной серии статей ["Nix pills"](https://nixos.org/nixos/nix-pills)
@@ -352,7 +354,7 @@ nix-repl> s."123"
352nix-repl> s.${toString (122 + 1)}
354nix-repl> s.${toString (122 + 1)}
353"num"
355"num"
354```
356```
355−***
357+## Множества аттрибутов
356```
358```
357nix-repl> s ? "123"
359nix-repl> s ? "123"
358true
360true
@@ -821,20 +823,20 @@ in
821
823
822## Сборка с библиотеками: `NIX_CFLAGS_COMPILE`, `NIX_LDFLAGS`
824## Сборка с библиотеками: `NIX_CFLAGS_COMPILE`, `NIX_LDFLAGS`
823<!--
825<!--
824−Если мы хотим собирать пакеты, которые зависят от сторонних библиотек, нам понадобится ещё немного магии: нужно указать GCC и ld, где искать заголовочные и объектные файлы библиотек. Для этого существуют переменные `NIX_CFLAGS_COMPILE` и `NIX_LDFLAGS_`
826+Если мы хотим собирать пакеты, которые зависят от сторонних библиотек, нам понадобится ещё немного магии: нужно указать GCC и ld, где искать заголовочные и объектные файлы библиотек. Для этого существуют переменные `NIX CFLAGS COMPILE` и `NIX LDFLAGS`
825-->
827-->
826### `generic-builder.sh`
828### `generic-builder.sh`
827```
829```
828[...]
830[...]
829for p in $baseInputs $buildInputs; do
831for p in $baseInputs $buildInputs; do
830− if [ -d $p/bin ]; then
832+ [...]
831− export PATH="$p/bin${PATH:+:}$PATH"
832− fi
833 if [ -d $p/include ]; then
833 if [ -d $p/include ]; then
834− export NIX_CFLAGS_COMPILE="-I $p/include${NIX_CFLAGS_COMPILE:+ }$NIX_CFLAGS_COMPILE"
834+ export NIX_CFLAGS_COMPILE="-I $p/include${NIX_CFLAGS_COMPILE:+ }\
835+$NIX_CFLAGS_COMPILE"
835 fi
836 fi
836 if [ -d $p/lib ]; then
837 if [ -d $p/lib ]; then
837− export NIX_LDFLAGS="-rpath $p/lib -L $p/lib${NIX_LDFLAGS:+ }$NIX_LDFLAGS"
838+ export NIX_LDFLAGS="-rpath $p/lib -L \
839+$p/lib${NIX_LDFLAGS:+ }$NIX_LDFLAGS"
838 fi
840 fi
839done
841done
840[...]
842[...]
@@ -847,7 +849,9 @@ done
847mkDerivation {
849mkDerivation {
848 name = "graphviz";
850 name = "graphviz";
849 src = ./graphviz-2.38.0.tar.gz;
851 src = ./graphviz-2.38.0.tar.gz;
852+ buildInputs = if gdSupport
850− buildInputs = if gdSupport then [ gd fontconfig libjpeg bzip2 ] else [];
853+ then [ gd fontconfig libjpeg bzip2 ]
854+ else [];
851}
855}
852```
856```
853***
857***
@@ -874,11 +878,14 @@ in
874-->
878-->
875### `default.nix`
879### `default.nix`
876```
880```
881+let
882+ pkgs = import <nixpkgs> {};
883+ mkDerivation = import ./generic-builder.nix pkgs;
884+in
877{
885{
878 hello = callPackage ./hello.nix { };
886 hello = callPackage ./hello.nix { };
879 graphviz = callPackage ./graphviz.nix { };
887 graphviz = callPackage ./graphviz.nix { };
880− graphvizCore = callPackage ./graphviz.nix
888+ graphvizCore = callPackage ./graphviz.nix { gdSupport = false; };
881− { gdSupport = false; };
882}
889}
883```
890```
884***
891***
@@ -907,7 +914,8 @@ nix-repl> builtins.intersectAttrs (builtins.functionArgs add) values
907```
914```
908nix-repl> callPackage = set: f:
915nix-repl> callPackage = set: f:
909 f (builtins.intersectAttrs
916 f (builtins.intersectAttrs
910− (builtins.functionArgs f) set)
917+ (builtins.functionArgs f)
918+ set)
911nix-repl> callPackage values add
919nix-repl> callPackage values add
9128
9208
913nix-repl> with values; add { inherit a b; }
921nix-repl> with values; add { inherit a b; }
@@ -920,7 +928,9 @@ nix-repl> with values; add { inherit a b; }
920```
928```
921nix-repl> callPackage = set: f: overrides:
929nix-repl> callPackage = set: f: overrides:
922 f ((builtins.intersectAttrs
930 f ((builtins.intersectAttrs
923− (builtins.functionArgs f) set) // overrides)
931+ (builtins.functionArgs f)
932+ set)
933+ // overrides)
924nix-repl> callPackage values add { }
934nix-repl> callPackage values add { }
9258
9358
926nix-repl> callPackage values add { b = 12; }
936nix-repl> callPackage values add { b = 12; }
@@ -933,7 +943,10 @@ let
933 allPkgs = nixpkgs // pkgs;
943 allPkgs = nixpkgs // pkgs;
934 callPackage = path: overrides:
944 callPackage = path: overrides:
935 let f = import path;
945 let f = import path;
936− in f ((builtins.intersectAttrs (builtins.functionArgs f) allPkgs) // overrides);
946+ in f ((builtins.intersectAttrs
947+ (builtins.functionArgs f)
948+ allPkgs)
949+ // overrides);
937 pkgs = with nixpkgs; {
950 pkgs = with nixpkgs; {
938 mkDerivation = import ./generic-builder.nix nixpkgs;
951 mkDerivation = import ./generic-builder.nix nixpkgs;
939 hello = callPackage ./hello.nix { };
952 hello = callPackage ./hello.nix { };
@@ -953,7 +966,7 @@ VS.
953
966
954mygraphviz = pkgs.graphviz.override { gd = customgd }
967mygraphviz = pkgs.graphviz.override { gd = customgd }
955```
968```
956−***
969+## Паттерн `override`: `makeOverridable`
957<!--
970<!--
958Для реализации нашей затеи напишем функцию `mkOverridable`, которая будет принимать функцию, возвращающую attrset, и attrset (который будет являться "дефолтными" аргументами для данной функции). Вернет `makeOverridable` тот же attrset, что вернула бы данная функция, с добавлением аттрибута `override`, который является функцией, позволяющей нам "перегружать" стандартные аргументы.
971Для реализации нашей затеи напишем функцию `mkOverridable`, которая будет принимать функцию, возвращающую attrset, и attrset (который будет являться "дефолтными" аргументами для данной функции). Вернет `makeOverridable` тот же attrset, что вернула бы данная функция, с добавлением аттрибута `override`, который является функцией, позволяющей нам "перегружать" стандартные аргументы.
959-->
972-->
@@ -970,8 +983,7 @@ rec {
970 };
983 };
971}
984}
972```
985```
973−***
986+## Паттерн `override`: потестируем!
974−### Протестируем в `nix repl`
975<!--
987<!--
976Работает! Теперь мы можем легко "перегружать" аргументы пакетов (которые, напомню, просто функции) в нашем репозитории. Нужно только не забыть вызывать все эти пакеты с makeOverridable.
988Работает! Теперь мы можем легко "перегружать" аргументы пакетов (которые, напомню, просто функции) в нашем репозитории. Нужно только не забыть вызывать все эти пакеты с makeOverridable.
977-->
989-->
@@ -986,7 +998,7 @@ nix-repl> res2
986nix-repl> res2.override { b = 20; }
998nix-repl> res2.override { b = 20; }
987{ override = «lambda»; result = 30; }
999{ override = «lambda»; result = 30; }
988```
1000```
989−***
1001+## Паттерн `override`: объединяем с `callPackage`
990### `lib.nix`
1002### `lib.nix`
991```
1003```
992rec {
1004rec {
@@ -995,10 +1007,12 @@ rec {
995 let f = import path;
1007 let f = import path;
996 in makeOverridable
1008 in makeOverridable
997 f ((builtins.intersectAttrs
1009 f ((builtins.intersectAttrs
998− (builtins.functionArgs f) pkgs) // overrides);
1010+ (builtins.functionArgs f)
1011+ pkgs)
1012+ // overrides);
999}
1013}
1000```
1014```
1001−***
1015+## Паттерн `override`: репозиторий
1002### `default.nix`
1016### `default.nix`
1003```
1017```
1004let
1018let
@@ -1014,9 +1028,51 @@ let
1014 };
1028 };
1015in pkgs
1029in pkgs
1016```
1030```
1017−## nixpkgs
1031+## nixpkgs: краткая справка
1032+
1033+### Общая конфигурация для всех пакетов
1034+
1035+* `import <nixpkgs> { config = {...}; }`
1036+* `$NIXPKGS_CONFIG`
1037+* `~/.config/nixpkgs/config.nix`
1038+
1039+
1040+### Перегрузка пакетов
1041+
1042+```
1043+config.packageOverrides = oldPkgs: {
1044+ graphviz = oldPkgs.graphviz.override { gd = customgd; };
1045+}
1046+```
1047+
1048+### Оверлеи
1049+```
1050+nixpkgs.overlays = [ (self: super: {
1051+ graphviz = super.graphviz.override { gd = customgd; };
1052+} ) ];
1053+```
1054+
1055+## `stdenv.mkDerivation`: прокачиваем наш `mkDerivation`
1018<!--
1056<!--
1019−Изначально я планировал вкратце рассказать про остальные паттерны nixpkgs, но в итоге получился просто объяснение, что же происходит в каждом файле, которое к тому же растянуло бы презентацию ещё на несколько десятков слайдов. На самом деле, на данный момент ваших знаний nix вполне достаточно для чтения исходников nixpkgs.
1057+Наша функция `mkDerivation`, без сомнения, прекарасна, но можно лучше! `stdenv.mkDerivation` из nixpkgs предоставляет интерфейс (т.е принимаемые и возвращаемые значения) очень похожие на наш `mkDerivation`, с несколькими отличиями:
1020-->
1058-->
1021−> Изучение nixpkgs остается в качестве упражнения для слушателя.
1059+`stdenv.mkDerivation` может...
1060+
1061+* Изменять поведение фаз, например `{ buildPhase = "make"; }`
1062+* Изменять список фаз `{ phases = [ "buildPhase" ]; }`
1063+* Перегружать аргументы с помощью `overrideAttrs`
1064+* Автоматически добавлять хуки на проброс зависимостей с помощью `propogatedBuildInputs`
1065+
1066+
1067+## Что осталось за кадром в этом разделе
1068+
1069+<!--
1070+Нельзя объять необъятное -- а nixpkgs действительно необъятен, более 100МБ кода на данный момент -- и поэтому я оставлю изучение частностей на совести слушателя.
1071+-->
1072+
1073+* `stdenv`
1074+* `lib`
1075+* `fix`
1076+* ...
1077+<https://nixos.org/nixos/nix-pills> и <https://nixos.org/nixpkgs/manual> -- для тех, кому надо или интересно!
1022
1078