Home » Учебные и справочные материалы · Мастерство

Учебные и справочные материалы · Мастерство

Опубликовано

История до рецепта

Я некоторое время слежу за проектом Nix, но теперь, когда я закончил свою докторскую диссертацию, у меня наконец-то появилось немного свободного времени и энергии, чтобы попытаться использовать его всерьез. В этой серии я изучаю Nix, показывая вам, как все работает и как собирать кусочки вместе.

Для тех из вас, кто не знает, Nix доводит воспроизводимые сборки до их логического завершения, делая сборки пакетов (в основном) чистыми функциями их зависимостей. Двоичные артефакты сборок хранятся в хранилище с адресацией содержимого (хранилище Nix), поэтому вы можете быть уверены, что всегда получаете один и тот же пакет, если у вас есть его имя и хэш. Таким образом вы можете не только создавать программы, но и создавать среды разработки («Я хочу, чтобы эти библиотеки были доступны в моей среде сборки и ничего больше», например), запускать команды в одноразовых средах с установленными определенными пакетами, не загрязняя ваш глобальная среда. Существует даже операционная система NixOS, основанная на этой системе пакетов, которая позволяет вам настраивать всю вашу систему (установленные пакеты, системные настройки и т. д.) из одного файла.

Теперь, после всего сказанного, Nix может быть пугающим просто потому, что он сильно отличается от других систем упаковки. Во-первых, пакеты Nix написаны на чисто функциональном языке, также называемом Nix. Терминология, используемая в экосистеме Nix, также довольно уникальна, поэтому чтение о Nix часто может показаться классическим:

В конце каждого поста будет раздел «вопросы к аудитории». Я буду задавать вопросы там, когда не смогу найти удовлетворительные ответы самостоятельно, в надежде, что читатели, знакомые с Nix, смогут дать ответы, которые я затем смогу включить как для себя, так и для всех, кто читает эти сообщения позже. . В конце также будет раздел «Ресурсы», где я буду ссылаться на сообщения и документацию, которые я использовал для ответов на свои вопросы.

В этой серии я сосредоточусь на использовании флейков в максимально возможной степени, но из того, что я уже прочитал, кажется, что вам все еще нужно знать, как работают производные до флейков, чтобы получить максимальную отдачу от Nix.

Сегодняшняя цель: сбор ресурсов

Этот пост будет сборником документации Nix, как официальной, так и неофициальной. Это заслуживает отдельного поста просто потому, что я обнаружил, что официальная документация Nix разбросана по нескольким источникам. Я не первый, кто указывает на это, но (1) я одержимый писатель, и у меня уже есть все эти ссылки, и (2) я хотел бы иметь все в одном месте для всех, кто читает эту серию.

Официальный

Это ресурсы, поддерживаемые самим проектом Nix. Вы должны рассматривать их как источник истины, но вы также должны реалистично относиться к документации с открытым исходным кодом и осознавать, что она может быть устаревшей. По моему опыту, некоторые из этих ресурсов трудно понять, если вы не знаете, о чем они говорят. Я бы в основном использовал их в качестве справочных материалов и не рекомендовал бы пытаться читать их от корки до корки, если вам действительно нечем заняться.

Read more:  Какие планеты Солнечной системы? Давайте познакомимся с характеристиками и их классификацией, Научные материалы для средней школы 7 класса

Справочное руководство Никс

Справочное руководство Nix охватывает множество тем, начиная от установки Nix и заканчивая справочными страницами для nix команды. Я бы сказал, что самые полезные части здесь:

Как ни странно, в ссылке на nix flake Команда вы найдете очень подробное описание схемы для флейка Nix, в том числе какие атрибуты требуются, как ссылаться на другие флейки и т. д. Я думаю, что это должно жить где-то еще, но я рад, что оно где-то существует.

Руководство Nixpkgs

Руководство Nixpkgs — это подробное руководство по использованию Nix для создания пакетов и базовым инструментам, которые предоставляет Nix. Поскольку хлопья все еще считаются экспериментальными, это в основном касается того, как делать производные «по-старому». За короткое время изучения Nix я обнаружил, что вы должны понимать, как работает экосистема pre-flakes, чтобы получить максимальную отдачу от Nix. Части, которые я нашел наиболее полезными:

Стандартная среда (stdenv) — набор пакетов (gcc, makeи т. д.) и функции Nix (mkDerivation, mkShellи т. д.) считается минимальным для создания большинства программ и сред разработки. В главе «Языки и фреймворки» описываются встроенные функции для создания программного обеспечения на вашем любимом языке, например buildRustPackage для ржавчины, buildGoModule для Go и т. д. Вы определенно обнаружите, что некоторые языки поддерживаются лучше, чем другие, и даже если ваш язык поддерживается встроенным конструктором, вы можете найти сторонний инструмент, который имеет лучший пользовательский интерфейс. например poetry2nix для Python или crane для ржавчины.

Это сайт, на котором вы можете искать все пакеты, доступные в официальном репозитории Nixpkgs.

Одна вещь, которую я нахожу странной, заключается в том, что вы не можете ссылаться на конкретный результат поиска, поскольку результаты поиска не имеют своих собственных страниц. Например, если я ищу rustc Мне представлен список результатов поиска. Первым результатом поиска является rustc пакет, как и ожидалось, а имя пакета оформлено так, как будто это ссылка (например, оно оформлено так, как будто это rustc), но на самом деле это не ссылка. При нажатии на имя пакета открывается более подробный вид пакета, включая предоставляемые им программы, сопровождающих и т. д. На панели вкладок есть теги привязки (часть с надписью «nix-env», «Конфигурация NixOS» и “nix-shell”), но если вы скопируете эту ссылку, она будет содержать весь запрос, содержащий этот результат поиска. Не идеально. Обязательно должен быть способ ссылки на конкретный пакет. Может быть, и есть, и я просто пропустил это, но это просто означает, что это не очевидно.

Никс Таблетки

На мой взгляд, название предполагает, что Nix Pills содержит небольшие кусочки прагматических знаний Nix, например, как настроить приглашение оболочки в оболочке разработки. На самом деле я обнаружил, что это глубокое погружение во внутренности Nix. На самом деле я еще не слишком много прочитал об этом, но я уверен, что прочитаю раздел здесь и там, когда узнаю больше о том, как все работает под капотом.

Учитывая, что существует целый Интернет контента по любой заданной теме, мне нереально перечислить все ресурсы о Никсе. Вместо этого я собираюсь перечислить ресурсы, которые, по моему мнению, будут особенно полезны для меня, или ресурсы, о которых, по моему мнению, должно знать больше людей. Я гарантирую вам, что я упустил ресурсы, которые другие люди сочтут отличными по той или иной причине.

НикОС Вики

Вики NixOS — это вики, поддерживаемая сообществом для NixOS, а не только для Nix. Соответственно, вы найдете здесь страницы, посвященные не только созданию и сборке пакетов Nix, но и целому ряду других тем, например, как настроить dotfiles с помощью Nix, как развернуть сервер NixOS и т. д. Это прагматичный ресурс, который показывает вам, как делать всевозможные вещи, а не сосредотачиваться на том, как все работает под капотом.

Например, страница Flakes показывает вам, что вам нужно для создания flake.nix, но это не объясняет все очень подробно. Он также покажет вам, как выполнять различные задачи с хлопьями, например интегрировать их с direnv для автоматического входа в оболочку разработки при входе в определенный каталог.

Nix.dev

В самом верху написано, что это самоуверенное руководство. Поскольку я полный n00b, я понятия не имею, являются ли эти мнения (1) хорошими или (2) широко распространенными. Вот некоторые основные моменты:

От нуля до Никса

Это совершенно новый ресурс на момент написания статьи. Я думаю, что это будет отличный ресурс через 2 года. Сейчас это относительно редко, но мне нравится концепция. Сайт разделяет свои материалы на руководство «Быстрый старт» и «Концепции». Концепции связаны друг с другом в своего рода графе знаний, так что вы можете подражать этому опыту поздней ночи в Википедии в кроличьей норе, оставаясь во вселенной Nix.

Тони Финн — Никс из First Principles: Flake Edition

Это серия сообщений в блоге, показывающих, как начать работу с Nix. Вы можете предположить из названия, что он использует флейки с самого начала, но вы не познакомились с флейками до нескольких статей. Я действительно думаю, что это хороший ход. Я думаю, вам нужно понимать экосистему Nix, как она есть сегодня, чтобы получить максимальную отдачу от флейков. Это по-прежнему хороший обзор того, что вы можете сделать с Nix, и это ресурс, к которому я возвращаюсь.

Ян Генри – Как выучить Никса

Это не столько учебник, сколько погружение одного человека в безумие во время изучения Никса. Это не учебник, который учит вас, как использовать Nix, это поток сознания одного человека, когда он изучает Nix, и это действительно освежает. В какой-то момент вы будете читать документацию Nix, и вы обнаружите, что ваши глаза скользят по предложению только для того, чтобы понять, что вы понятия не имеете, что вы только что прочитали. Эта серия валидирует в том смысле, что кто-то еще читает ту же документацию и произносит «подождите, что я только что прочитал?». Это лучшее использование вашего времени, чтобы изучить Nix, читая эту серию? Наверное, нет, но это может быть интересно и утешительно. Я не читал всю серию, потому что у меня короткая продолжительность концентрации внимания, но полезно прочитать и понять, что Никс иностранец, это не только ты.

Чего не хватает

Я провожу много времени в экосистеме Rust, где есть обширная автоматически генерируемая документация по типам, сигнатурам функций, структурам модулей и т. д. для каждого пакета, опубликованного на crates.io. Это то, чего мне очень не хватает, когда имеешь дело с Никсом. Например, нет доступного для просмотра списка функций, доступных в Nixpkgs, с атрибутами, которые они ожидают в качестве входных данных, и атрибутами, которые они предоставляют в качестве выходных данных. Nix – это чисто функциональный язык, разве статический анализ не может определить большую часть этого? Разве вы не должны иметь возможность добавлять в комментарии семантическое значение, которое превращается в HTML-документацию? В частности, какова сигнатура функции чего-то вроде mkShell? Входы очень похожи на mkDerivationно я понятия не имею, как выглядят результаты.

Еще одна вещь, которой мне не хватает в экосистеме Nix, — это сплоченная стратегия документирования. Мотивация для всего этого поста заключается в том, что документация разбросана.

Заключение

Итак, надеюсь, вы нашли это полезным. В первой настоящей части этой серии мы рассмотрим, как создать флейк с нуля (на самом деле нет, начиная с пустого файла). В более поздних выпусках будут рассмотрены такие темы, как указание отдельных наборов зависимостей времени сборки, времени разработки и времени выполнения, создание образов Docker из фрагментов Nix, настройка полезных оболочек разработки и множество других тем. До следующего раза, пусть космические лучи никогда не перевернут ваши биты.

PS – Вы можете следить за мной на Mastodon в @zmitchell для Rust, Nix, теплых кадров и фотографий кошек.

PPS – Если вы заметили, что что-то может быть более доступным, пожалуйста, свяжитесь с нами, и я сделаю все возможное, чтобы это исправить!

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.