git.iko.soy/typeable/nix-pills-ru
on master help sign in
5 files changed+99−36
since splitsnapshots
unifiedsplit
.gitignore+2−2 Makefile+11−6 README.md+8−4 default.nix−2 nix.md → presentation.md+78−22
.gitignore+2−2
@@ -1,5 +1,5 @@
1−nix.pdf
2−nix.html
1+presentation.pdf
2+presentation.html
33speaker-notes.md
44speaker-notes.html
55images/graphviz*
Makefile+11−6
@@ -1,10 +1,15 @@
1−nix.pdf: nix.md; pandoc nix.md -t beamer --slide-level=2 --pdf-engine xelatex -F pandoc-filter-graphviz -o nix.pdf
2−nix.html: nix.md; pandoc nix.md -t slidy -F pandoc-filter-graphviz -o nix.html;
3−speaker-notes.md: nix.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
1+all: presentation.pdf presentation.html speaker-notes.html
2+.PHONY : all
53
6−build: nix.pdf nix.html speaker-notes.html
74
5+.PHONY: autoreload
86autoreload: ; while sleep 1; do make --no-print-directory -s; done
97
10−all: build
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+
15+
README.md+8−4
@@ -1,9 +1,13 @@
11# Nix pills in russian
22
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).
44
5−Markdown document is located [here](./nix.md)
5+Markdown document is located [here](./presentation.md).
66
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).
88
9−To start automatic regeneration of aforementioned build artifacts, run `nix-shell --run make`
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+
13+To start automatic regeneration of aforementioned files, run `make autoreload`.
default.nix−2
@@ -26,6 +26,4 @@ in stdenv.mkDerivation rec {
2626 phases = [ "buildPhase" ];
2727
2828 preferLocalBuild = true;
29−
30− shellHook = "make build";
3129}
nix.md → presentation.mdrenamed+78−22
@@ -39,6 +39,8 @@ header-includes:
3939
4040Вы можете прекратить слушать после любой секции, и я надеюсь, что вы унесете какую-то полезную для себя информацию.
4141
42+Исходники, собранный pdf и заметки докладчика для этой презентации находятся на <https://github.com/typeable/nix-pills-ru>
43+
4244
4345<!--
4446Как вы все скорее всего знаете, мы используем Nix для сборки и тестирования нашего кода. Я, Александр Бантьев (@balsoft) отвечаю за инфраструктуру сборки пакетов (Hydra, NixOps), а также за поддержание инструкций сборки в актуальном состоянии. Я бы хотел рассказать вам про nix с помощью вольного пересказа отличной серии статей ["Nix pills"](https://nixos.org/nixos/nix-pills)
@@ -352,7 +354,7 @@ nix-repl> s."123"
352354nix-repl> s.${toString (122 + 1)}
353355"num"
354356```
355−***
357+## Множества аттрибутов
356358```
357359nix-repl> s ? "123"
358360true
@@ -821,20 +823,20 @@ in
821823
822824## Сборка с библиотеками: `NIX_CFLAGS_COMPILE`, `NIX_LDFLAGS`
823825<!--
824−Если мы хотим собирать пакеты, которые зависят от сторонних библиотек, нам понадобится ещё немного магии: нужно указать GCC и ld, где искать заголовочные и объектные файлы библиотек. Для этого существуют переменные `NIX_CFLAGS_COMPILE` и `NIX_LDFLAGS_`
826+Если мы хотим собирать пакеты, которые зависят от сторонних библиотек, нам понадобится ещё немного магии: нужно указать GCC и ld, где искать заголовочные и объектные файлы библиотек. Для этого существуют переменные `NIX CFLAGS COMPILE` и `NIX LDFLAGS`
825827-->
826828### `generic-builder.sh`
827829```
828830[...]
829831for p in $baseInputs $buildInputs; do
830− if [ -d $p/bin ]; then
831− export PATH="$p/bin${PATH:+:}$PATH"
832− fi
832+ [...]
833833 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"
835836 fi
836837 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"
838840 fi
839841done
840842[...]
@@ -847,7 +849,9 @@ done
847849mkDerivation {
848850 name = "graphviz";
849851 src = ./graphviz-2.38.0.tar.gz;
850− buildInputs = if gdSupport then [ gd fontconfig libjpeg bzip2 ] else [];
852+ buildInputs = if gdSupport
853+ then [ gd fontconfig libjpeg bzip2 ]
854+ else [];
851855}
852856```
853857***
@@ -874,11 +878,14 @@ in
874878-->
875879### `default.nix`
876880```
881+let
882+ pkgs = import <nixpkgs> {};
883+ mkDerivation = import ./generic-builder.nix pkgs;
884+in
877885{
878886 hello = callPackage ./hello.nix { };
879887 graphviz = callPackage ./graphviz.nix { };
880− graphvizCore = callPackage ./graphviz.nix
881− { gdSupport = false; };
888+ graphvizCore = callPackage ./graphviz.nix { gdSupport = false; };
882889}
883890```
884891***
@@ -907,7 +914,8 @@ nix-repl> builtins.intersectAttrs (builtins.functionArgs add) values
907914```
908915nix-repl> callPackage = set: f:
909916 f (builtins.intersectAttrs
910− (builtins.functionArgs f) set)
917+ (builtins.functionArgs f)
918+ set)
911919nix-repl> callPackage values add
9129208
913921nix-repl> with values; add { inherit a b; }
@@ -920,7 +928,9 @@ nix-repl> with values; add { inherit a b; }
920928```
921929nix-repl> callPackage = set: f: overrides:
922930 f ((builtins.intersectAttrs
923− (builtins.functionArgs f) set) // overrides)
931+ (builtins.functionArgs f)
932+ set)
933+ // overrides)
924934nix-repl> callPackage values add { }
9259358
926936nix-repl> callPackage values add { b = 12; }
@@ -933,7 +943,10 @@ let
933943 allPkgs = nixpkgs // pkgs;
934944 callPackage = path: overrides:
935945 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);
937950 pkgs = with nixpkgs; {
938951 mkDerivation = import ./generic-builder.nix nixpkgs;
939952 hello = callPackage ./hello.nix { };
@@ -953,7 +966,7 @@ VS.
953966
954967mygraphviz = pkgs.graphviz.override { gd = customgd }
955968```
956−***
969+## Паттерн `override`: `makeOverridable`
957970<!--
958971Для реализации нашей затеи напишем функцию `mkOverridable`, которая будет принимать функцию, возвращающую attrset, и attrset (который будет являться "дефолтными" аргументами для данной функции). Вернет `makeOverridable` тот же attrset, что вернула бы данная функция, с добавлением аттрибута `override`, который является функцией, позволяющей нам "перегружать" стандартные аргументы.
959972-->
@@ -970,8 +983,7 @@ rec {
970983 };
971984}
972985```
973−***
974−### Протестируем в `nix repl`
986+## Паттерн `override`: потестируем!
975987<!--
976988Работает! Теперь мы можем легко "перегружать" аргументы пакетов (которые, напомню, просто функции) в нашем репозитории. Нужно только не забыть вызывать все эти пакеты с makeOverridable.
977989-->
@@ -986,7 +998,7 @@ nix-repl> res2
986998nix-repl> res2.override { b = 20; }
987999{ override = «lambda»; result = 30; }
9881000```
989−***
1001+## Паттерн `override`: объединяем с `callPackage`
9901002### `lib.nix`
9911003```
9921004rec {
@@ -995,10 +1007,12 @@ rec {
9951007 let f = import path;
9961008 in makeOverridable
9971009 f ((builtins.intersectAttrs
998− (builtins.functionArgs f) pkgs) // overrides);
1010+ (builtins.functionArgs f)
1011+ pkgs)
1012+ // overrides);
9991013}
10001014```
1001−***
1015+## Паттерн `override`: репозиторий
10021016### `default.nix`
10031017```
10041018let
@@ -1014,9 +1028,51 @@ let
10141028 };
10151029in pkgs
10161030```
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`
10181056<!--
1019−Изначально я планировал вкратце рассказать про остальные паттерны nixpkgs, но в итоге получился просто объяснение, что же происходит в каждом файле, которое к тому же растянуло бы презентацию ещё на несколько десятков слайдов. На самом деле, на данный момент ваших знаний nix вполне достаточно для чтения исходников nixpkgs.
1057+Наша функция `mkDerivation`, без сомнения, прекарасна, но можно лучше! `stdenv.mkDerivation` из nixpkgs предоставляет интерфейс (т.е принимаемые и возвращаемые значения) очень похожие на наш `mkDerivation`, с несколькими отличиями:
10201058-->
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> -- для тех, кому надо или интересно!
10221078