Controle Seus Pacotes Com Perfis Criados Em Nix!
Table of Contents
Nix tem muitas vantagens sobre a maioria dos gerenciadores de pacotes. Hoje, eu vou escrever sobre uma delas.
Nix é um gerenciador de pacotes para o NixOS, mas você pode instalá-lo em outros sistemas operacionais. Um problema nos sistemas normais é que você está / deveria estar nervoso quando instala pacotes, porque você simplesmente não sabe o que e exatamente aonde eles serão instalados. Tente removê-los, e aí então…
Bem, existe uma solução - Nix - que funciona assim: quando você instala um
pacote, ele vai diretamente para algum diretório de nome comprido com um hash
em seu nome, no /nix/store/...
e é linkado no perfil que está disponível
para um usuário específico ou para todos os usuários, você pode criar ambientes
com estes perfis.
Existem três formas de se instalar um pacote com o Nix:
- No ambiente de sistema, dentro do sistema global em
/etc/nixos/configuration.nix
(disponível somente para usuários de NixOS); - No ambiente de usuário com o comando
nix-env –install
; e - No ambiente customizado
1 Ambiente de Sistema
Exemplo (declare dentro de /etc/nixos/configuration.nix
):
environment.systemPackages = [ pkgs.perl pkgs.emacs pkgs.thunderbird pkgs.firefox ];
Não há muito a se dizer; os pacotes serão baixados do cache ou compilados se não existirem binários disponíveis.
Lembre-se: quando se instala, digamos, uma aplicação perl, em um ambiente, você não verá o executável perl propriamente dito, você terá que especificá-lo separadamente.
2 Ambiente de Usuário
Exemplo (como usuário normal, sem sudo
, é claro):
$ nix-env -iA pkgs.emacs24
Este pacote será instalado em algum lugar como
/nix/store/qv39sv3981kk5h4p260y879wilfc3c26-emacs-24.3
; vejamos o que tem lá
dentro (em dois níveis de profundidade):
/nix/store/qv39sv3981kk5h4p260y879wilfc3c26-emacs-24.3 |-- bin/ | |-- ctags* | |-- ebrowse* | |-- emacs -> emacs-24.3* | |-- emacs-24.3* | |-- emacsclient* | |-- etags* | `-- grep-changelog* |-- libexec/ | `-- emacs/ |-- share/ | |-- applications/ | |-- emacs/ | |-- icons/ | |-- info/ | `-- man/ `-- var/ `-- games/
Você pode ver que tudo deste pacote está em um só lugar. Dependências também são lidadas de uma maneira similar e são reutilizadas para outros pacotes, claro.
Bem, como é que um usuário pode ver/usar o pacote correto? A resposta é simples: cada usuário tem seu próprio perfil, o qual é um diretório, e links são criados dentro dele.
Se algum usuário quer o emacs23 e não o emacs24, isto não é um problema, as dependências serão reutilizadas e novos links no outro perfil de usuário serão criados.
3 Ambientes Customizados
Aqui é que começa a diversão!
Se você quer o emacs23 lado a lado com o emacs24, você precisa criar um ambiente customizado. Neste exemplo eu criarei dois ambientes customizados, um para cada pacote, mas você pode ter um emacs no ambiente de usuário e outro no customizado.
Edite/crie um novo arquivo ~/.nixpkgs/config.nix
:
{ packageOverrides = pkgs: rec { homeEnv = pkgs.buildEnv { name = "homeEnv"; paths = [ pkgs.emacs24 pkgs.bsdgames ]; }; workEnv = pkgs.buildEnv { name = "workEnv"; paths = [ pkgs.emacs23 pkgs.perl ]; }; }; }
Então você precisa construir estes dois perfis:
$ nix-env -p /nix/var/nix/profiles/per-user/<USERNAME>/workEnv -i workEnv $ nix-env -p /nix/var/nix/profiles/per-user/<USERNAME>/homeEnv -i homeEnv
Eu escolhi criar perfis dentro da pasta
/nix/var/nix/profiles/per-user/<USERNAME>/
, mas você pode usar ~/profiles/
ou o que bem entender. A flag -i
é a --install
que vimos antes e estamos
desta vez instalando perfis de nome homeEnv
e workEnv
. Vamos ver o que tem
dentro de homeEnv
(desta vez em um nível de profundidade):
/nix/store/rg4zh4s2gaw1b3dm2kgicis8admsaanx-homeEnv |-- bin/ |-- libexec -> /nix/store/qv39sv3981kk5h4p260y879wilfc3c26-emacs-24.3/libexec/ |-- share/ `-- var -> /nix/store/qv39sv3981kk5h4p260y879wilfc3c26-emacs-24.3/var/
Você pode ver que o perfil é na realidade criado dentro de /nix/store
e se
algum outro usuário escolhe criar os mesmos pacotes para o seu perfil, apenas um
link será criado - o perfil dele será o mesmo que o nosso.
Falta mais uma coisinha… Crie mais dois arquivos, um para o ambiente homeEnv
export PATH=/nix/var/nix/profiles/per-user/<USERNAME>/homeEnv/bin $@
e outro para o workEnv
export PATH=/nix/var/nix/profiles/per-user/<USERNAME>/workEnv/bin $@
Você precisará invocar estes scripts via source
para montar estas variáveis
de ambiente para o perfil ou torná-los executáveis (também torne-os disponíveis
na variável de ambiente PATH
) e execute comandos como argumentos de linha de
comando (por isso o $@
).
Isto foi brincadeirra de criança. Ambientes são úteis em desenvolvimento, você pode ter um perfil para desenvolvimento Perl e outro para Python, um em cada perfil é claro, aplicações só verão umas às outras, isso também depende de variáveis de ambiente da shell, para meu perfil Python 2.7 o arquivo se parece com isso:
#!/usr/bin/env bash NIX_USER_PROFILE_DIR=/nix/var/nix/profiles/per-user/matej nixprofile=$NIX_USER_PROFILE_DIR/py27 export PATH="$nixprofile/bin" export LD_LIBRARY_PATH="$nixprofile/lib" export NIX_LDFLAGS="-L$nixprofile/lib -L$nixprofile/lib/pkgconfig" export NIX_CFLAGS_COMPILE="-I$nixprofile/include -I$nixprofile/include/sasl" export PKG_CONFIG_PATH="$nixprofile/lib/pkgconfig" export PYTHONPATH="$nixprofile/lib/python2.7/site-packages" export PS1="py27 $PS1" export INCLUDE="$nixprofile/include:$INCLUDE" export LIB="$nixprofile/lib:$LIB" export C_INCLUDE_PATH="$nixprofile/include:$C_INCLUDE_PATH" export LD_RUN_PATH="$nixprofile/lib:$LD_RUN_PATH" export LIBRARY_PATH="$nixprofile/lib:$LIBRARY_PATH" export CFLAGS=$NIX_CFLAGS_COMPILE export LDFLAGS=$NIX_LDFLAGS "$@"
Isto conclui este post.
4 META
Título Original | Control your packages with Nix created profiles! |
Autor | Matej Cotman |
Link Original | http://blog.matejc.com/blogs/myblog/control-your-packages-with-nix-environments |
Link Arquivado | http://archive.is/OZ3CG |
Created: 2018-03-04 dom 13:41
Nenhum comentário:
Postar um comentário