Jul 06, 2016
|
См.также
Nix - пакетный менеджер, который устанавливает пакеты изолированно друг от друга. Изначально появился в процессе научной работы Eelco Dolstra и позже обрел огромную популярность и сторонников данной идеи, что в итоге сформировало очень активное сообщество, ссылки на которое можно найти здесь NixOS.
Nix в отличии от других UNIX дистрибутивов устанавливает пакеты всегда в
одно и то же место /nix/store/
. Внутри каждого пакета создается необходимая
структура директорий bin
, etc
, lib
, и прочее. Пользователь видит
это все у себя за счет симлинков, которые прописываются при установке, см.
рисунок:
Это позволяет избежать конфликта имен, при установке пакетов и иметь в системе несколько версий одной и той же программы собранной по разному.
Отличительной особенностью nix, является то, что он не зависит от
дистрибутива. Единственным требованием является поддержка POSIX
потоков и
C++
компилятор. Все пакеты из реп запускаются, без проблем, на любом Linux
дистрибутиве и многие платформонезависимые пакеты работают в MacOS
. Есть
инструкции как установить nix в Cygwin
под Windows
. Я пользуюсь
nix под CentOS6
, CentOS7
, Ubuntu
, NixOS
и это работает
везде одинаково хорошо.
Из плюсов можно отметить:
yum
,
apt
, apk
, ...glibc
/nix
, не захламляет систему, удаляется
одной командой rm -rf /nix
Из минусов:
NixOS
Установка крайне простая, делается одной командой:
$ curl https://nixos.org/nix/install | sh
NixOS удивительный проект с очень хорошей документацией и большим
мега-активным сообществом (NixOS). Поэтому нет смысла дублировать
документацию, опишу лишь некоторые команды в сравнении с пакетным менеджером
apt
.
nix-shell
создает изолированное окружение (наподобие virtualenv
в
питоне) и позволяет запускать в нем команды или выполнять nix
скрипты.
Пример как создать окружение с nodejs
, python3
и gnumake
:
$ nix-shell -p nodejs python3 gnumake
После этого nodejs
, python3
и gnumake
появятся в нашем окружении.
Выйти из окружения можно так-же как и из bash оболочки Ctrl
+ D
или командой exit
.
Понять что мы находимся в nix-shell
сессии можно при помощи переменной
окружения:
$ env | grep IN_NIX_SHELL
IN_NIX_SHELL=1
Я добавил отображение символа снежинки ❄
в PS1
, если nix-shell
сессия активна.
Очень удобно создавать окружение для скриптов через shebang:
#! /usr/bin/env nix-shell
#! nix-shell -i python -p python pythonPackages.prettytable
import prettytable
# Print a simple table.
t = prettytable.PrettyTable(["N", "N^2"])
for n in range(1, 10): t.add_row([n, n * n])
print t
#! /usr/bin/env nix-shell
#! nix-shell -i bash -p cowsay
cowsay "Превед nix-shell!!!"
По умолчанию команда nix-shell
ищет файл default.nix
в текущей
директории и пытается его выполнить, таким образом мы можем создавать для своих
проектов своеобразное виртуальное окружение, просто положив этот файл в корень
проекта и прописав в нем необходимые пакеты и правила сборки. Такой проект
легко будет развернуть на любой системе. Отличной демонстрацией этого является
проект RhodeCode (позволяет управлять кодом как GitLab
, но при этом
может использовать разные системы контроля версий git
, hg
, svn
и
интегрируется с разными треккерами задач вплоть до Trello
), который можно
развернуть у себя за 5 мин при помощи команды nix-shell
(https://docs.rhodecode.com/RhodeCode-Enterprise/contributing/dev-setup.html).
Также nix-shell
позволяет присваивать имена окружениям и запускать
nix
выражения, например что бы собрать приложение изолированно от общих
установленных пакетов.
Более подробно, что такое язык nixexpr
и как при помощи его собирать
пакеты и даже ОС NixOS, я постараюсь описать в отдельной статье.
Что бы Ubuntu
знала о наших приложениях нужно прописать симлинк:
ln -s ${HOME}/.nix-profile/share/applications/ \
${HOME}/.local/share/applications/
Пакетный менеджер Nix
имеет огромное количество преимуществ, которые
упрощают процессы администрирования, программирования, сборки и тестирования
ПО. Теперь на разных Линуксах все работает одинаково! А в CentOS6 есть gcc6.