Próximo: Invocando guix pack
, Anterior: Invocando guix shell
, Acima: Desenvolvimento [Conteúdo][Índice]
guix environment
O objetivo do guix environment
é auxiliar na criação de ambientes
de desenvolvimento.
Aviso de descontinuação: O comando
guix environment
foi descontinuado em favor doguix shell
, que executa funções semelhantes, mas é mais conveniente de usar. Veja Invocandoguix shell
.Sendo obsoleto, o
guix environment
está programado para remoção futura, mas o projeto Guix está comprometido em mantê-lo até 1º de maio de 2023. Entre em contato conosco pelo e-mail guix-devel@gnu.org se quiser discutir o assunto.
A sintaxe geral é:
guix environment opções pacote…
O exemplo a seguir gera uma nova configuração de shell para o desenvolvimento do GNU Guile:
guix environment guile
Se as dependências necessárias ainda não foram construídas, guix
environment
as constrói automaticamente. O ambiente do novo shell é uma
versão aumentada do ambiente em que guix environment
foi
executado. Ele contém os caminhos de pesquisa necessários para construir o
pacote fornecido adicionado às variáveis de ambiente existentes. Para criar
um ambiente “puro”, no qual as variáveis de ambiente originais foram
desconfiguradas, use a opção --pure16.
Sair de um ambiente Guix é o mesmo que sair do shell, e colocará o usuário
de volta no ambiente antigo antes de guix environment
ser
invocado. A próxima coleta de lixo (veja Invocando guix gc
) limpará os
pacotes que foram instalados de dentro do ambiente e não são mais usados
fora dele.
guix environment
define a variável GUIX_ENVIRONMENT
no shell
que ele gera; seu valor é o nome do arquivo do perfil deste ambiente. Isso
permite que os usuários, digamos, definam um prompt específico para
ambientes de desenvolvimento em seu .bashrc (veja Bash Startup
Files em Manual de referência do GNU Bash):
if [ -n "$GUIX_ENVIRONMENT" ] then export PS1="\u@\h \w [dev]\$ " fi
... ou para navegar pelo perfil:
$ ls "$GUIX_ENVIRONMENT/bin"
Além disso, mais de um pacote pode ser especificado, em cujo caso a união das entradas para os pacotes fornecidos é usada. Por exemplo, o comando abaixo gera um shell onde todas as dependências do Guile e do Emacs estão disponíveis:
guix environment guile emacs
Às vezes, uma sessão de shell interativa não é desejada. Um comando
arbitrário pode ser invocado colocando o token --
para separar o
comando do resto dos argumentos:
guix environment guile -- make -j4
Em outras situações, é mais conveniente especificar a lista de pacotes
necessários no ambiente. Por exemplo, o comando a seguir executa
python
de um ambiente contendo Python 3 e NumPy:
guix environment --ad-hoc python-numpy python -- python3
Além disso, pode-se querer as dependências de um pacote e também alguns pacotes adicionais que não são dependências de tempo de construção ou tempo de execução, mas são úteis ao desenvolver, no entanto. Por causa disso, o sinalizador --ad-hoc é posicional. Pacotes que aparecem antes de --ad-hoc são interpretados como pacotes cujas dependências serão adicionadas ao ambiente. Pacotes que aparecem depois são interpretados como pacotes que serão adicionados ao ambiente diretamente. Por exemplo, o comando a seguir cria um ambiente de desenvolvimento Guix que inclui adicionalmente Git e strace:
guix environment --pure guix --ad-hoc git strace
Às vezes, é desejável isolar o ambiente o máximo possível, para máxima pureza e reprodutibilidade. Em particular, ao usar Guix em uma distribuição host que não seja Guix System, é desejável impedir o acesso a /usr/bin e outros recursos de todo o sistema do ambiente de desenvolvimento. Por exemplo, o comando a seguir gera um Guile REPL em um “contêiner” onde apenas o armazém e o diretório de trabalho atual são montados:
guix environment --ad-hoc --container guile -- guile
Nota: A opção --container requer Linux-libre 3.19 ou mais recente.
Outro caso de uso típico para contêineres é executar aplicativos sensíveis à
segurança, como um navegador da web. Para executar o Eolie, precisamos expor
e compartilhar alguns arquivos e diretórios; incluímos nss-certs
e
expomos /etc/ssl/certs/ para autenticação HTTPS; finalmente,
preservamos a variável de ambiente DISPLAY
, pois os aplicativos
gráficos em contêiner não serão exibidos sem ela.
guix environment --preserve='^DISPLAY$' --container --network \ --expose=/etc/machine-id \ --expose=/etc/ssl/certs/ \ --share=$HOME/.local/share/eolie/=$HOME/.local/share/eolie/ \ --ad-hoc eolie nss-certs dbus -- eolie
As opções disponíveis estão resumidas abaixo.
--check
Configure o ambiente e verifique se o shell sobrecarregaria as variáveis de ambiente. Veja --check, para mais informações.
--root=arquivo
¶-r arquivo
Crie arquivo como uma ligação simbólica para o perfil deste ambiente e registre-a como raiz do coletor de lixo.
Isso é útil se você deseja proteger seu ambiente da coleta de lixo, para torná-lo “persistente”.
Quando esta opção pe omitida, o ambiente é protegido da coleta de lixo
apenas pela duração da sessão do guix environment
. Isso significa
que na próxima vez que você recriar o mesmo ambiente, você tpoderia ter que
reconstruir ou refazer o download dos pacotes. Veja Invocando guix gc
,
para mais sobre GC roots.
--expression=expr
-e expr
Crie um ambiente para o pacote ou lista de pacotes que expr avalia.
Por exemplo, executando:
guix environment -e '(@ (gnu packages maths) petsc-openmpi)'
inicia um shell com o ambiente para esta variante específica do pacote PETSc.
Rodando:
guix environment --ad-hoc -e '(@ (gnu) %base-packages)'
inicia um shell com todos os pacotes do sistema base disponíveis.
Os comandos acima usam apenas a saída padrão dos pacotes fornecidos. Para selecionar outras saídas, duas tuplas de elementos podem ser especificadas:
guix environment --ad-hoc -e '(list (@ (gnu packages bash) bash) "include")'
--load=arquivo
-l arquivo
Crie um ambiente para o pacote ou lista de pacotes que o código dentro de arquivo avalia.
Por exemplo, arquivo pode conter uma definição como esta (veja Definindo pacotes):
(use-modules (guix) (gnu packages gdb) (gnu packages autotools) (gnu packages texinfo)) ;; Augment the package definition of GDB with the build tools ;; needed when developing GDB (and which are not needed when ;; simply installing it.) (package (inherit gdb) (native-inputs (modify-inputs (package-native-inputs gdb) (prepend autoconf-2.69 automake texinfo))))
--manifest=arquivo
-m arquivo
Crie um ambiente para os pacotes contidos no objeto manifest retornado pelo código Scheme em arquivo. Esta opção pode ser repetida várias vezes, nesse caso os manifestos são concatenados.
Isso é semelhante à opção de mesmo nome em guix package
(veja --manifest) e usa os mesmos arquivos de
manifesto.
Veja guix shell --export-manifest
, para
obter informações sobre como “converter” opções de linha de comando em um
manifesto.
--ad-hoc
Inclui todos os pacotes especificados no ambiente resultante, como se um pacote ad hoc fosse definido com eles como entradas. Esta opção é útil para criar rapidamente um ambiente sem ter que escrever uma expressão de pacote para conter as entradas desejadas.
Por exemplo, o comando:
guix environment --ad-hoc guile guile-sdl -- guile
executa guile
em um ambiente onde Guile e Guile-SDL estão
disponíveis.
Observe que este exemplo solicita implicitamente a saída padrão de
guile
e guile-sdl
, mas é possível solicitar uma saída
específica — por exemplo, glib:bin
solicita a saída bin
de
glib
(veja Pacotes com múltiplas saídas).
Esta opção pode ser composta com o comportamento padrão de guix
environment
. Pacotes que aparecem antes de --ad-hoc são
interpretados como pacotes cujas dependências serão adicionadas ao ambiente,
o comportamento padrão. Pacotes que aparecem depois são interpretados como
pacotes que serão adicionados ao ambiente diretamente.
--profile=perfil
-p perfil
Crie um ambiente contendo os pacotes instalados em perfil. Use
guix package
(veja Invocando guix package
) para criar e
gerenciar perfis.
--pure
Desconfigura variáveis de ambiente existentes ao construir o novo ambiente, exceto aquelas especificadas com --preserve (veja abaixo). Isso tem o efeito de criar um ambiente no qual os caminhos de pesquisa contêm apenas entradas de pacote.
--preserve=regexp
-E regexp
Quando usado junto com --pure, preserva as variáveis de ambiente que correspondem a regexp—em outras palavras, coloca-as em uma “lista branca” de variáveis de ambiente que devem ser preservadas. Esta opção pode ser repetida várias vezes.
guix environment --pure --preserve=^SLURM --ad-hoc openmpi … \ -- mpirun …
Este exemplo executa mpirun
em um contexto onde as únicas
variáveis de ambiente definidas são PATH
, variáveis de ambiente cujo
nome começa com ‘SLURM’, bem como as variáveis “preciosas” usuais
(HOME
, USER
, etc.).
--search-paths
Exiba as definições de variáveis de ambiente que compõem o ambiente.
--system=sistema
-s sistema
Tente construir para sistema—por exemplo, i686-linux
.
--container
¶-C
Execute comando dentro de um contêiner isolado. O diretório de trabalho atual fora do contêiner é mapeado dentro do contêiner. Além disso, a menos que substituído por --user, um diretório pessoal (home) fictício é criado que corresponde ao diretório pessoal do usuário atual, e /etc/passwd é configurado adequadamente.
O processo gerado é executado como o usuário atual fora do contêiner. Dentro do contêiner, ele tem o mesmo UID e GID que o usuário atual, a menos que --user seja passado (veja abaixo).
--network
-N
Para contêineres, compartilhe o namespace de rede com o sistema host. Os contêineres criados sem esse sinalizador têm acesso somente ao dispositivo de loopback.
--link-profile
-P
Para contêineres, vincule o perfil do ambiente a ~/.guix-profile
dentro do contêiner e defina GUIX_ENVIRONMENT
para isso. Isso é
equivalente a tornar ~/.guix-profile uma ligação simbólica para o
perfil real dentro do contêiner. A vinculação falhará e abortará o ambiente
se o diretório já existir, o que certamente será o caso se guix
environment
foi invocado no diretório pessoal do usuário.
Certos pacotes são configurados para procurar em ~/.guix-profile por arquivos de configuração e dados;17 --link-profile permite que esses programas se comportem conforme o esperado no ambiente.
--user=usuário
-u usuário
Para contêineres, use o nome de usuário usuário no lugar do usuário atual. A entrada /etc/passwd gerada dentro do contêiner conterá o nome usuário, o diretório pessoal será /home/usuário e nenhum dado GECOS do usuário será copiado. Além disso, o UID e o GID dentro do contêiner são 1000. usuário não precisa existir no sistema.
Além disso, qualquer caminho compartilhado ou exposto (veja --share e --expose respectivamente) cujo destino esteja dentro do pessoal do usuário atual será remapeado em relação a /home/USUÁRIO; isso inclui o mapeamento automático do diretório de trabalho atual.
# will expose paths as /home/foo/wd, /home/foo/test, and /home/foo/target cd $HOME/wd guix environment --container --user=foo \ --expose=$HOME/test \ --expose=/tmp/target=$HOME/target
Embora isso limite o vazamento da identidade do usuário por meio de caminhos iniciais e de cada um dos campos do usuário, esse é apenas um componente útil de uma solução mais ampla de privacidade/anonimato — não uma solução em si.
--no-cwd
Para contêineres, o comportamento padrão é compartilhar o diretório de trabalho atual com o contêiner isolado e mudar imediatamente para esse diretório dentro do contêiner. Se isso for indesejável, --no-cwd fará com que o diretório de trabalho atual não seja compartilhado automaticamente e mudará para o diretório pessoal do usuário dentro do contêiner. Veja também --user.
--expose=fonte[=alvo]
--share=fonte[=alvo]
Para contêineres, --expose (resp. --share) expõe o sistema de arquivos fonte do sistema host como o sistema de arquivos somente leitura (resp. gravável) alvo dentro do contêiner. Se alvo não for especificado, fonte será usado como o ponto de montagem de destino no contêiner.
O exemplo abaixo gera um Guile REPL em um contêiner no qual o diretório pessoal do usuário é acessível somente para leitura por meio do diretório /exchange:
guix environment --container --expose=$HOME=/exchange --ad-hoc guile -- guile
--emulate-fhs
-F
Para contêineres, emule uma configuração Filesystem Hierarchy Standard (FHS)
dentro do contêiner, veja
a especificação
oficial. Como o Guix se desvia da especificação FHS, esta opção configura o
contêiner para imitar mais de perto o de outras distribuições
GNU/Linux. Isto é útil para reproduzir outros ambientes de desenvolvimento,
testar e usar programas que esperam que a especificação FHS seja
seguida. Com esta opção, o contêiner incluirá uma versão de glibc
que
lerá /etc/ld.so.cache
dentro do contêiner para o cache da biblioteca
compartilhada (ao contrário de glibc
no uso regular do Guix) e
configurará os diretórios FHS esperados: /bin
, /etc
,
/lib
e /usr
do perfil do contêiner.
guix environment
também oferece suporte a todas as opções de
compilação comuns que guix build
oferece suporte (veja Opções de compilação comuns), bem como opções de transformação de pacotes (veja Opções de transformação de pacote).
Às vezes, os usuários
aumentam incorretamente as variáveis de ambiente, como PATH
em seu
arquivo ~/.bashrc. Como consequência, quando guix
environment
o inicia, o Bash pode ler ~/.bashrc, introduzindo assim
“impurezas” nessas variáveis de ambiente. É um erro definir essas
variáveis de ambiente em .bashrc; em vez disso, elas devem ser
definidas em .bash_profile, que é originado apenas por shells de
login. Veja Bash Startup Files em Manual de referência do GNU Bash,
para detalhes sobre os arquivos de inicialização do Bash.
Por exemplo, o pacote
fontconfig
inspeciona ~/.guix-profile/share/fonts por fontes
adicionais.
Próximo: Invocando guix pack
, Anterior: Invocando guix shell
, Acima: Desenvolvimento [Conteúdo][Índice]