A Nova Interface de Linha de Comando
Após habilitar os recursos nix-command e flakes, você pode começar a usar as ferramentas de linha de comando da nova geração do Nix fornecidas por New Nix Commands. Nesta seção, vamos focar em dois comandos: nix shell e nix run. Outros comandos importantes, como o nix build, serão discutidos em detalhes em nix develop e pkgs.mkShell
nix shell
O comando nix shell permite que você entre em um ambiente com o pacote Nix especificado e abra um shell interativo dentro desse ambiente:
# hello não está disponível
› hello
hello: comando não encontrado
# Entre em um ambiente com os pacotes 'hello' e `cowsay`
› nix shell nixpkgs#hello nixpkgs#cowsay
# hello agora está disponível
› hello
Hello, world!
# cowsay também está disponível
› cowsay "Hello, world!"
_______
< hello >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||nix run
Por outro lado, o nix run cria um ambiente com o pacote Nix especificado e executa esse pacote diretamente dentro do ambiente (sem instalá-lo no ambiente do sistema):
# hello não está disponível
› hello
hello: comando não encontrado
# Crie um ambiente com o pacote 'hello' e o execute.
› nix run nixpkgs#hello
Hello, world!Como o nix run executa o pacote Nix diretamente, o pacote especificado como argumento deve gerar um programa executável.
De acordo com a documentação do nix run --help, o nix run executa o comando <out>/bin/<name>, onde <out> ié o diretório raiz da derivation e <name> é selecionado na seguinte ordem:
- O atributo
meta.mainProgramda derivation. - O atributo
pnameda derivation. - O conteúdo do atributo
nameda derivation com o número da versão removido.
Por exemplo, no caso do pacote 'hello' que testamos anteriormente, o nix run na verdade executa o programa $out/bin/hello.
Aqui estão mais dois exemplos com explicações detalhadas dos parâmetros relevantes:
# Explicação do comando:
# `nixpkgs#ponysay` significa o pacote 'ponysay' no flake 'nixpkgs'.
# `nixpkgs` é um ID do registro de flakes, e o Nix encontrará o endereço do repositório correspondente no GitHub a partir de <https://github.com/NixOS/flake-registry/blob/master/flake-registry.json>.
# Portanto, este comando cria um novo ambiente, instala e executa o pacote 'ponysay' fornecido pelo flake 'nixpkgs'.
# Observação: Foi mencionado anteriormente que um pacote Nix é uma das saídas de um flake.
echo "Hello Nix" | nix run "nixpkgs#ponysay"
# Este comando tem o mesmo efeito que o anterior, mas usa a URI completa do flake em vez do ID do registro de flakes.
echo "Hello Nix" | nix run "github:NixOS/nixpkgs/nixos-unstable#ponysay"Casos de Uso Comuns para nix run e nix shell
Esses comandos são comumente usados para executar programas de forma temporária. Por exemplo, se eu quiser clonar meu repositório de configuração usando o Git em um novo host NixOS sem ter o Git instalado, posso usar o seguinte comando:
nix run nixpkgs#git clone git@github.com:ryan4yin/nix-config.gitComo alternativa, posso usar o nix shell para entrar em um ambiente com o Git e, em seguida, executar o comando git clone:
nix shell nixpkgs#git
git clone git@github.com:ryan4yin/nix-config.git