domingo, 4 de março de 2018

Controle Seus Pacotes Com Perfis Criados Em Nix! [matej cotman]

Controle Seus Pacotes Com Perfis Criados Em Nix!

Controle Seus Pacotes Com Perfis Criados Em Nix!

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

Table 1: 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

Validate

Nenhum comentário:

Postar um comentário

Entendendo o Combinador Y [hishamhm]

Entendendo, Finalmente, o Combinador Y - Uma Abordagem de uma Perspectiva Amigável a Programadores Entendendo, Finalmente, o...