Ir para o conteúdo principal
Background Image

Instalando Nix no macOS

·1265 palavras·6 minutos
Lucas Limeira
Autor
Lucas Limeira

Instalando Nix no macOS
#

Recentemente adquiri um novo computador e, com ele, veio aquele mix de sentimentos ao configurá-lo do zero para as minhas necessidades (todo bom nerd já se divertiu bastante fazendo isso). Eu já tenho uma porção de scripts que facilitam a minha configuração inicial do computador, porém, ultimamente tenho lido e experimentado Nix e pensei: isso pode ser uma ótima oportunidade de usá-lo! Mas, afinal… o que é Nix?

A página do projeto no Github o descreve como:

Nix is a powerful package manager for Linux and other Unix systems that makes package management reliable and reproducible.

Em tradução livre: “Nix é um poderoso gerenciador de pacotes para Linux e outros sistemas Unix que torna o gerenciamento de pacotes confiável e reproduzível”.

Com a linguagem Nix, podemos definir de forma declarativa quais pacotes queremos instalar em nosso sistema. Não apenas isso, utilizando Nix como nosso gerenciador de pacotes, estaremos usando o repositório de pacotes nixpkgs , que, no presente momento, é o maior e mais atualizado repositório de pacotes disponível (como pode ser visto no Repology):

Screenshot of Repology page

Ok, poder declarar quais pacotes queremos instalados no nosso sistema já é algo incrível e que ajuda bastante no setup inicial de uma nova máquina, mas algo que meus scripts fazem além de instalar pacotes e aplicações é configurar o meu sistema. Felizmente, o Nix também permite isso — inclusive, há uma distribuição Linux completa construída em torno dessa proposta: o NixOS.

Recentemente eu comecei a experimentar o NixOS em meu homelab, com o intuito de ter VMs com setups simples e reproduzíveis. A configuração do NixOS pode ser feita completamente de forma declarativa escrita em Nix, porém para o macOS, esse suporte não é incluso por padrão e é aí que entra mais um incrível projeto: o nix-darwin.

A página do projeto no Github o descreve como:

This project aims to bring the convenience of a declarative system approach to macOS. nix-darwin is built up around Nixpkgs, quite similar to NixOS.

Em tradução livre: “Este projeto visa trazer a conveniência de uma abordagem declarativa de sistema para o macOS. O nix-darwin é construído em torno do Nixpkgs, de maneira bastante similar ao NixOS”.

Após essa introdução às ferramentas usadas, vou contar quais foram os passos que segui para instalar o Nix no macOS e criar uma configuração inicial.

Instalando o Nix no macOS
#

Instalar o Nix no macOS é algo bem simples, basicamente você tem que executar o seguinte comando no seu terminal:

curl -L https://nixos.org/nix/install | sh

Esse comando fará download do script de instalação do Nix e executá-lo no seu terminal. A instalação é super intuitiva e transparente, então basta seguir os passos dados pelo próprio script.

⚠️ NOTA: Caso você, assim como eu, tenha o FileVault ativado no seu macOS, pode ocorrer um problema na instalação do Nix, especificamente no bootstrap do novo volume de disco usado pelo Nix. Felizmente, o script detecta esse problema e te dá os passos para solucioná-lo: basicamente reiniciar o computador e executar o script de instalação novamente.

Após completar a instalação, para conferir que tudo ocorreu como esperado, basta abrir uma nova janela do terminal e executar o seguinte comando:

nix --version

Caso o comando execute com sucesso e você visualize a versão do Nix, a instalação foi bem sucedida!

Criando uma configuração inicial com nix-darwin e Flakes
#

Agora que temos o Nix instalado na nossa máquina, vamos criar uma configuração inicial com suporte ao nix-darwin. A maneira mais simples de fazer isso é utilizando uma feature do Nix chamada Flakes. Eu não vou me aprofundar no Flakes por não ser o foco desse artigo, mas considere que é uma feature do Nix que nos ajuda a “lockar” versões de dependências.

Antes de tudo, vamos criar o diretório onde nossa configuração irá ficar. No meu caso, eu optei por usar ~/.config/nix, mas sinta-se livre para usar qualquer localização que achar mais conveniente.

mkdir -p ~/.config/nix && cd ~/.config/nix

Dentro do novo diretório, vamos inicializar nossa configuração utilizando um template pronto para utilizar o nix-darwin. Aqui você tem a opção de criar sua configuração apontando para uma versão específica do repositório do nixpkgs ou utilizar a unstable. Eu optei por utilizar a unstable para ter a versão mais atualizada dos pacotes.

Para nixpkgs 25.05:

nix flake init -t nix-darwin/nix-darwin-25.05 --extra-experimental-features "nix-command flakes"

Ou para nixpkgs unstable:

nix flake init -t nix-darwin/master --extra-experimental-features "nix-command flakes"

Após isso, você terá um arquivo chamado flake.nix no seu diretório. Essa é a sua configuração nix e ela deve ser similar à essa:

{
  description = "Example nix-darwin system flake";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    nix-darwin.url = "github:nix-darwin/nix-darwin/master";
    nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
  };

  outputs = inputs@{ self, nix-darwin, nixpkgs }:
  let
    configuration = { pkgs, ... }: {
      # List packages installed in system profile. To search by name, run:
      # $ nix-env -qaP | grep wget
      environment.systemPackages =
        [ pkgs.vim
        ];

      # Necessary for using flakes on this system.
      nix.settings.experimental-features = "nix-command flakes";

      # Enable alternative shell support in nix-darwin.
      # programs.fish.enable = true;

      # Set Git commit hash for darwin-version.
      system.configurationRevision = self.rev or self.dirtyRev or null;

      # Used for backwards compatibility, please read the changelog before changing.
      # $ darwin-rebuild changelog
      system.stateVersion = 6;

      # The platform the configuration will be used on.
      nixpkgs.hostPlatform = "aarch64-darwin";
    };
  in
  {
    # Build darwin flake using:
    # $ darwin-rebuild build --flake .#simple
    darwinConfigurations."simple" = nix-darwin.lib.darwinSystem {
      modules = [ configuration ];
    };
  };
}

Por padrão, o nome da configuração do nix-darwin é chamada de simple no template. Você pode trocar pelo nome que preferir, mas o que eu vejo comumente é utilizar o hostname da sua máquina, pois, por padrão, essa é a configuração procurada pelo nix-darwin ao tentar realizar build e aplicá-la.

Algo também importante é verificar o valor utilizado em nixpkgs.hostPlatform. Esse valor deve ser correspondente à arquitetura do processador da sua máquina:

  • aarch64-darwin para Macs com Apple Silicon (M1, M2, M3, etc)
  • x86_64-darwin para Macs com processador Intel

Por último, precisamos fazer apenas mais uma alteração: adicionar nossa configuração de usuário, especificando o diretório home dele. Para isso, basta adicionar a seguinte linha logo abaixo da linha nixpkgs.hostPlatform = "aarch64-darwin":

users.users.<nome-do-seu-usuario> = "/Users/<nome-do-seu-usuario>";

# No meu caso, seria:
# users.users.lucas.home = "/Users/lucas";

Caso não saiba seu nome de usuário, basta executar o comando whoami no seu terminal.

Agora podemos usar o darwin-rebuild para buildar nossa configuração e aplicá-la. Nessa primeira execução, o darwin-rebuild ainda não está instalado em nossa máquina, então usaremos o comando nix run que nos permite utilizar um pacote mesmo sem ele estar instalado no momento. Outro ponto é que, para aplicar a configuração, é necessário executar o comando com sudo, pois o nix-darwin gerencia várias configurações do macOS que, para serem alteradas, precisam de privilégios de root.

sudo nix run nix-darwin/master#darwin-rebuild --extra-experimental-features "nix-command flakes" -- --flake ~/.config/nix#<nome-da-sua-config> switch

Lembre-se que, caso tenha usado o nome da sua configuração igual ao hostname da sua máquina, você pode omitir a parte #<nome-da-sua-config> do comando.

Depois da primeira execução, você pode buildar e aplicar a configuração usando o comando:

sudo darwin-rebuild switch --flake ~/.config/nix#<nome-da-sua-config>

Pronto! Sua configuração está aplicada! No momento, ela apenas instala o pacote vim na sua máquina, como pode ser visto em:

environment.systemPackages =
  [ pkgs.vim
  ];

Mas sinta-se livre para pesquisar em search.nixos.org/packages os pacotes necessários para o seu uso. No próximo artigo, pretendo entrar em mais detalhes sobre como integrar o Homebrew para permitir a instalação de pacotes não disponíveis no nixpkgs. Nesse meio tempo, super recomendo o guia do nix.dev sobre a linguagem Nix e seu funcionamento.