Logo

dev-resources.site

for different kinds of informations.

Criando um ambiente de desenvolvimento com Nix

Published at
7/9/2022
Categories
nix
flakes
environment
portuguese
Author
dmass
Categories
4 categories in total
nix
open
flakes
open
environment
open
portuguese
open
Author
5 person written this
dmass
open
Criando um ambiente de desenvolvimento com Nix

O que é nix?

Se você não sabe o que é Nix, eu escrevi um artigo sobre como usá-lo como um gerenciador de pacotes onde eu falo sobre o que é Nix.

Para continuar a leitura desse artigo, eu recomendo que você leia o outro, pois vamos utilizar alguns conceitos explicados lá.

Preparação

Nesse artigo, vamos usar o flakes, assim como no artigo passado.

Se você usa o Nix como seu gerenciador de pacotes, da forma que expliquei no outro artigo, você pode pular para a próxima seção.

Caso contrário, você precisa habilitar o uso do flakes pelo Nix. Para isso, basta criar o arquivo ~/.config/nix/nix.conf com o conteúdo:

experimental-features = nix-command flakes

Isso diz ao Nix para habilitar o flakes sem precisar passar uma flag.

Agora, vamos em frente!

O que é um ambiente de desenvolvimento?

Um ambiente de desenvolvimento é um "ambiente" onde todas as ferramentas necessárias para desenvolver um projeto estão disponíveis.

Com o Nix, conseguimos utilizar pacotes sem instalá-los no nosso sistema, através de um arquivo declarativo.

Ou seja, conseguimos criar um arquivo com todos os pacotes que queremos e o Nix se encarrega de disponibilizá-los temporariamente para nós.

Isso é ótimo, pois, além de não precisarmos instalar ferramentas na nossa máquina para projetos específicos, se subirmos esse arquivo para o repositório do projeto, toda a equipe pode ter o mesmo ambiente sem precisar instalar nada (além do Nix, é claro)!

Criando seu ambiente

O que vamos fazer para criar um ambiente é, na verdade, bem parecido com o que você viu no outro artigo.

Vamos supor que eu quero fazer uns exercícios de Rust no Exercism, mas não quero instalar nada de Rust na minha máquina, nem quero instalar o exercism.

Vou começar criando uma pasta Exercism na minha pasta HOME:

mkdir Exercism
Enter fullscreen mode Exit fullscreen mode

Dentro dessa pasta, vou criar um arquivo flake.nix com o conteúdo:

{
  description = "Ambiente para exercícios de Rust";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs { inherit system; };
      in {
        devShell = with pkgs; mkShell {
          packages = [
            exercism
            cargo
            libiconv
          ];
        };
      }
    );
}
Enter fullscreen mode Exit fullscreen mode

Começamos definindo o campo description com uma descrição do que se trata esse arquivo.

Depois definimos nossas dependências no campo inputs, que são:

  1. O repositório do nixpkgs
  2. Um utilitário chamado flake-utils, que vamos utilizar para criar um ambiente que suporte várias plataformas

No outputs chamamos a função eachDefaultSystem do flake-utils. Essa função recebe um callback onde recebemos o system. O que essa função faz é chamar esse callback para todas as plataformas que o Nix suporta (Linux, Mac e Windows) passando o system desta plataforma.

Nós definimos a variável pkgs com o valor resultante do nixpkgs configurado com o system que recebemos. Assim, os pacotes instalados serão da plataforma correta.

Por fim, definimos o campo devShell, que se refere ao shell que vamos criar, o valor vai ser o retorno da função mkShell. Nós passamos para essa função um set com um único campo packages, que é a lista de pacotes que queremos disponíveis no nosso shell.

No nosso caso, vamos precisar de 3 pacotes, o exercism que vai servir para baixar os exercícios e enviar o resultado, o cargo para rodar os testes em Rust e o libiconv que é necessário para o cargo rodar.

Agora, vamos rodar o comando:

nix develop
Enter fullscreen mode Exit fullscreen mode

E é aqui que a mágica acontece!

O Nix vai baixar os pacotes e torná-los disponíveis para a gente em um shell.

exercism version
> exercism version 3.0.13

cargo -V
> cargo 1.61.0
Enter fullscreen mode Exit fullscreen mode

Isso significa que eu posso baixar um exercício executando, por exemplo:

exercism download --exercise=reverse-string --track=rust
Enter fullscreen mode Exit fullscreen mode

E ele vai criar a pasta rust/reverse-string dentro da pasta Exercism que estamos.

Eu posso ir até essa pasta e rodar os testes usando o cargo:

cd rust/reverse-string
cargo test
Enter fullscreen mode Exit fullscreen mode

Quando eu terminar, é só eu sair do shell com exit e os pacotes que estavam disponíveis não estão mais.

exercism version             
> zsh: command not found: exercism

cargo -V   
> zsh: command not found: cargo
Enter fullscreen mode Exit fullscreen mode

Sistema limpo! ✨

Conclusão

Esse foi um exemplo bem bobo, mas deu para ter um gosto do que é capaz de fazer.

Você pode colocar qualquer ferramenta, como formatadores de código, language-servers etc.

No final, você vai ter o seu arquivo flake.nix e outro arquivo, criado pelo Nix, chamado flake.lock, esse último contém a versão de todos os pacotes baixados, assim, sempre que você ou uma pessoa da sua equipe rodar o nix develop, o ambiente vai ser o mesmo até na versão dos pacotes utilizados.

Espero que esse artigo tenha sido útil!

Boa sorte criando seus ambientes!

Até a próxima! 👋

portuguese Article's
28 articles in total
Favicon
Fundamentos da Segurança em Aplicações Web
Favicon
🇫🇷🇪🇸🇩🇪🇮🇹🇯🇵 What if we made DEV.to polyglot ?
Favicon
Usando o shepherdjs para fazer tours em uma aplicação nuxt (vue.js) (Parte 2)
Favicon
Usando o shepherdjs para fazer tours em uma aplicação nuxt (vue.js) (Parte 1)
Favicon
Criando um ambiente de desenvolvimento com Nix
Favicon
Usando constant e immutable para reduzir o custo de gás
Favicon
Introdução ao SEO
Favicon
Certificações AWS — Por quê e de que forma
Favicon
Ainda dá tempo de ser DEV?
Favicon
Como deixar os testes Jest mais rápidos?
Favicon
TCP Handshakes 101: o básico pra iniciar no assunto
Favicon
Introdução ao Bean Validation: Deixe o Java Trabalhar!
Favicon
TypeScript vs Dart - Coleções iteráveis
Favicon
Rust e eu – como tem sido a experiência e minha bibliografia comentada!
Favicon
O front-end além da web
Favicon
GitHub Alias FTW!
Favicon
Seu Commit + Rápido
Favicon
Iniciando com Github Desktop no Windows e MacOS
Favicon
Angular Reactive Forms Custom Validators[Português]
Favicon
/dev/All – uma comunidade de pessoas que amam programar
Favicon
Como eu gerencio o meu tempo.
Favicon
Uber Movement: antes e depois do COVID-19
Favicon
Por que você deveria dar uma chance ao Tailwind CSS
Favicon
5 Dicas para você saber no Javascript
Favicon
Como se constrói um sistema corporativo?
Favicon
Opções do Bash
Favicon
Depois do Café - Episodio 6 - Corona Edition - O que fazer no tempo livre?
Favicon
Episódio 5 - Corona Edition: Trabalhando de Casa

Featured ones: