Introdução aos Flakes
A funcionalidade experimental flakes é um desenvolvimento importante para o Nix. Ela introduz uma política para gerenciar dependências entre expressões Nix, melhora a reprodutibilidade, a componibilidade e a usabilidade no ecossistema Nix. Embora ainda seja um recurso experimental, os flakes são amplamente utilizados pela comunidade Nix.[1]
Flakes é uma das mudanças mais significativas que o projeto Nix já viu.[2]
Em termos simples, se você já trabalhou com JavaScript/Go/Rust/Python, deve estar familiarizado com arquivos como package.json
/go.mod
/Cargo.toml
/pyproject.toml
. Nessas linguagens de programação, esses arquivos são usados para descrever as dependências entre pacotes de software e como construir projetos.
Da mesma forma, os gerenciadores de pacotes nessas linguagens de programação também usam arquivos como package-lock.json
/go.sum
/Cargo.lock
/poetry.lock
para bloquear as versões das dependências, garantindo a reprodutibilidade dos projetos.
Flakes empresta ideias desses gerenciadores de pacotes para aprimorar a reprodutibilidade, a componibilidade e a usabilidade do ecossistema Nix.
Flakes introduz o flake.nix
, similar ao package.json
, para descrever as dependências entre pacotes Nix e como construir projetos. Além disso, ele fornece o flake.lock
, semelhante ao package-lock.json
, para bloquear as versões das dependências, garantindo a reprodutibilidade do projeto.
Por outro lado, as funcionalidades experimentais dos flakes não quebraram o design original do Nix no nível do usuário. Os dois novos arquivos flake.nix
/flake.lock
introduzidos pelos flakes são apenas um wrapper para outras configurações Nix. Nos capítulos seguintes, veremos que as funcionalidades dos flakes fornecem uma nova e mais conveniente maneira de gerenciar as dependências entre as expressões Nix com base no design original do Nix.
Uma Palavra de Cautela sobre os Flakes caution
Os benefícios dos flakes são evidentes, e toda a comunidade NixOS os adotou de todo o coração. Atualmente, mais da metade dos usuários utiliza flakes[3], o que nos dá a garantia de que os flakes não serão descontinuados.
⚠️ No entanto, é importante notar que flakes ainda é uma funcionalidade experimental. Alguns problemas persistem, e existe a possibilidade de introduzir mudanças breaking changes durante o processo de estabilização. A extensão dessas breaking changes ainda é incerta.
No geral, eu recomendo fortemente que todos usem flakes, especialmente porque este livro gira em torno do NixOS e de flakes. No entanto, é crucial estar preparado para problemas potenciais que podem surgir devido a futuras breaking changes.
Quando os Flakes Serão Estabilizados?
Eu me aprofundei em alguns detalhes sobre os flakes:
- [RFC 0136] A Plan to Stabilize Flakes and the New CLI Incrementally: Um plano para estabilizar incrementalmente os flakes e a nova CLI, que foi aceito.
- CLI stabilization effort: Uma issue que acompanha o progresso do esforço de estabilização da Nova CLI.
- Why Are Flakes Still Experimental? - NixOS Discourse: Um post discutindo por que os flakes ainda são considerados experimentais.
- Flakes Are Such an Obviously Good Thing - Graham Christensen: Um artigo enfatizando as vantagens dos flakes enquanto sugere áreas para melhoria em seu design e processo de desenvolvimento.
- teaching Nix 3 CLI and Flakes #281 - nix.dev: Uma issue sobre "Ensinar Nix 3 CLI e Flakes" no nix.dev, cuja conclusão é que não devemos promover funcionalidades instáveis no nix.dev.
Após analisar esses recursos, parece que os flakes podem ser (ou não...) estabilizados em até dois anos, possivelmente acompanhados de algumas breaking changes.
A Nova CLI e a CLI Clássica
O Nix introduziu duas funcionalidades experimentais, nix-command
e flakes
, no ano de 2020. Essas funcionalidades trouxeram uma nova interface de linha de comando (referida como a Nova CLI), uma definição padronizada da estrutura de pacotes Nix (conhecida como a funcionalidade Flakes), e funcionalidades como o flake.lock
, semelhante a arquivos de bloqueio de versão em cargo/npm. Apesar de serem experimentais a partir de 1º de fevereiro de 2024, essas funcionalidades ganharam ampla adoção dentro da comunidade Nix devido à sua significativa melhoria nas capacidades do Nix.
A atual Nova CLI do Nix (a funcionalidade experimental nix-command
) está fortemente acoplada à funcionalidade experimental Flakes. Embora existam esforços em andamento para separá-las explicitamente, usar flakes essencialmente exige o uso da Nova CLI. Neste livro, que serve como um guia para iniciantes em NixOS e Flakes, é necessário introduzir as diferenças entre a Nova CLI, da qual os flakes dependem, e a CLI antiga.
Aqui, listamos a antiga CLI do Nix e os conceitos relacionados que não são mais necessários ao usar a Nova CLI e os flakes (nix-command
e flakes
). Ao pesquisar, você pode substituí-los pelos comandos correspondentes da Nova CLI (exceto para nix-collect-garbage
, já que atualmente não há alternativa para este comando):
nix-channel
: Onix-channel
gerencia versões de entradas como o nixpkgs através de canais estáveis/instáveis, semelhante às listas de pacotes usadas por outras ferramentas de gerenciamento de pacotes, como apt/yum/pacman. É isso que tradicionalmente fornece o<nixpkgs>
na linguagem Nix.- Nos flakes, a funcionalidade do
nix-channel
é substituída pelo Registro de Flakes (nix registry
) para fornecer "alguma versão global não especificada do nixpkgs" para uso interativo da CLI (por exemplo,nix run nixpkgs#hello
). Ao usar umflake.nix
, as versões das entradas são gerenciadas no próprio flake. - Os flakes usam a seção
inputs
noflake.nix
para gerenciar as versões do nixpkgs e de outras entradas em cada flake em vez de usar um estado global.
- Nos flakes, a funcionalidade do
nix-env
: Onix-env
é uma ferramenta de linha de comando central para o Nix clássico, usada para gerenciar pacotes de software no ambiente do usuário.Ele instala pacotes a partir das fontes de dados adicionadas pelo
nix-channel
, fazendo com que a versão do pacote instalado seja influenciada pelo canal. Pacotes instalados comnix-env
não são automaticamente registrados na configuração declarativa do Nix e são completamente independentes de seu controle, tornando-os difíceis de reproduzir em outras máquinas. Atualizar pacotes instalados pornix-env
é lento e pode produzir resultados inesperados porque o nome do atributo onde o pacote foi encontrado no nixpkgs não é salvo.Portanto, não é recomendado usar este comando diretamente.
O comando correspondente na Nova CLI é o
nix profile
. essoalmente, não o recomendo para iniciantes.
nix-shell
: Onix-shell
cria um ambiente shell temporário, o que é útil para desenvolvimento e testes.- Nova CLI: Esta ferramenta é dividida em três subcomandos:
nix develop
,nix shell
, enix run
. Discutiremos esses três comandos em detalhes no capítulo Ambientes de Desenvolvimento no NixOS.
- Nova CLI: Esta ferramenta é dividida em três subcomandos:
nix-build
😮nix-build
constrói pacotes Nix e coloca os resultados da build em/nix/store
, mas não os registra na configuração declarativa do Nix.- Nova CLI: O
nix-build
é substituído pelonix build
.
- Nova CLI: O
nix-collect-garbage
: Comando de coleta de lixo usado para limpar Objetos de Store não utilizados em/nix/store
.- Existe um comando similar na Nova CLI,
nix store gc --debug
, mas ele não limpa as gerações de perfil, então atualmente não há alternativa para este comando.
- Existe um comando similar na Nova CLI,
E outros comandos menos comumente usados não estão listados aqui.
- Você pode consultar a lista detalhada de comparação de comandos em Tente explicar os comandos do nix.