<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: João Lucas de Moraes Pereira</title>
    <description>The latest articles on DEV Community by João Lucas de Moraes Pereira (@jjoaoll).</description>
    <link>https://dev.to/jjoaoll</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3417620%2F7c478bfa-cc7c-4d20-8129-62f24d8f288e.png</url>
      <title>DEV Community: João Lucas de Moraes Pereira</title>
      <link>https://dev.to/jjoaoll</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jjoaoll"/>
    <language>en</language>
    <item>
      <title>Empacotando programas com Nix</title>
      <dc:creator>João Lucas de Moraes Pereira</dc:creator>
      <pubDate>Thu, 07 Aug 2025 18:44:45 +0000</pubDate>
      <link>https://dev.to/jjoaoll/empacotando-programas-com-nix-4g3g</link>
      <guid>https://dev.to/jjoaoll/empacotando-programas-com-nix-4g3g</guid>
      <description>&lt;h2&gt;
  
  
  Fluxo normal via Nix
&lt;/h2&gt;

&lt;p&gt;No dia a dia, é bem mais comum usar o &lt;a href="https://search.nixos.org/packages" rel="noopener noreferrer"&gt;search do nixos&lt;/a&gt;, e ele resolve 99% dos problemas. Com uma comunidade forte e ativa, o nixpkgs fornece a maioria dos pacotes já prontos pra uso, bastando apenas ir lá e buscar. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F012mvlxyoi5ua78cj63q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F012mvlxyoi5ua78cj63q.png" alt="nixpkgs search" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No entanto, um belo dia você resolve procurar algum pacote que não está por lá ainda. Eu usava um pacote (&lt;a href="https://github.com/tsouanas/unicodef" rel="noopener noreferrer"&gt;unicodef&lt;/a&gt;) no meu arch&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5vitl862qzyfbgs8ybj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5vitl862qzyfbgs8ybj.png" alt="página principal do unicodef no github" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;que não estava disponível no nixpkgs e nem é popular o bastante para tal. Com ele, eu consigo configurar vários formatos pra unicode de maneira integrada, bastando configurar uma única vez. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9n1o90nyrcgflsrt97t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9n1o90nyrcgflsrt97t.png" alt="a list of some output formats from unicodef" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TOC?
&lt;/h2&gt;

&lt;p&gt;Daria pra seguir as orientações do repositório e só colocar o unicode.py em algum lugar do path, ou então compilar para binário e daí colocar em algum &lt;code&gt;/algo/legal/bin&lt;/code&gt; da vida, mas esse não seria bem um &lt;em&gt;jeito nix&lt;/em&gt; de resolver. &lt;/p&gt;

&lt;p&gt;Sem dúvidas, esse é um problema pequeno e talvez valesse bem mais a pena resolver de forma mais direta. Mas as habilidades usadas pra resolver esse problema simples também valem pra problemas mais complexos. &lt;/p&gt;

&lt;p&gt;Reprodutibilidade, atomicidade, declaratividade, .. Usar Nix pra resolver um problema trás muitas vantagens. Através desse problema simples, espero compartilhar +/- como funciona a criação de um pacote Nix. &lt;/p&gt;

&lt;h2&gt;
  
  
  Nix e nixpkgs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgc4khtvwkxi54ey6jkyb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgc4khtvwkxi54ey6jkyb.png" alt="Trindade Nix" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Existe uma certa trindade de coisas relacionadas com a palavra Nix. No presente texto, usarei "Nix" pra me referir à linguagem e nixpkgs pra me referir ao repositório. &lt;/p&gt;

&lt;h3&gt;
  
  
  Linguagem Nix
&lt;/h3&gt;

&lt;p&gt;Nix é uma linguagem de programação de domínio específico (DSL), puramente funcional, com lazy evaluation e sem tipos (você pode chamar de "tipagem dinâmica", se quiser). &lt;/p&gt;

&lt;p&gt;Em geral, é tão simples como um Json com funções e, portanto, trataremos apenas do mínimo necessário, adiante. &lt;/p&gt;

&lt;h3&gt;
  
  
  nixpkgs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/NixOS/nixpkgs" rel="noopener noreferrer"&gt;nixpkgs&lt;/a&gt; é um repositório cheio de pacotes e de funções úteis para usarmos em nix. Aqui, usaremos algumas delas. &lt;/p&gt;

&lt;p&gt;No &lt;code&gt;nix repl&lt;/code&gt;, por ex, é possível usar a expressão &lt;code&gt;&amp;lt;nixpkgs&amp;gt;&lt;/code&gt; para receber o caminho do seu sistema para a versão atual do repositório nixpkgs que o seu Nix está configurado para usar.&lt;/p&gt;

&lt;p&gt;Para ser mais exato, a própria expressão &lt;code&gt;&amp;lt;nixpkgs&amp;gt;&lt;/code&gt; é avaliada par ele. Ela diz ao Nix: "Vá para a localização do nixpkgs no meu sistema e use esse pacote como base para o que eu quero fazer."&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o pacote
&lt;/h2&gt;

&lt;p&gt;Primeiro vamos criar um diretório legal só pra isso, e nele, podemos criar um &lt;code&gt;arquivo.nix&lt;/code&gt; pra trabalhar, com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;mkdir &lt;/span&gt;my-first-package
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;my-first-package
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;unicodef.nix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abrindo o arquivo, vamos escrever uma expressão em nix que retorne uma derivação, para tal, usaremos a função &lt;code&gt;stdenv.mkDerivation&lt;/code&gt;, que recebe um conjunto de atributos, como um Json, e cria pra nós a derivação configurada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{}:&lt;/span&gt;

&lt;span class="nv"&gt;stdenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mkDerivation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logo de cara, definimos uma expressão Nix, mas discutamos um pouco sobre ela. os &lt;code&gt;{}:&lt;/code&gt; indica que estamos lidando com uma função anônima, que, ao receber todos esses argumentos (nenhum), vai retornar a saída da &lt;code&gt;stdenv.mkDerivation&lt;/code&gt; após receber outro conjunto de atributos vazis. &lt;/p&gt;

&lt;p&gt;No entanto, ao tentar &lt;code&gt;nix-build unicodef.nix&lt;/code&gt;, não vai compilar porque a Nix não vai saber quem é &lt;code&gt;stdenv&lt;/code&gt;. Pra resolver isso, vamos usar a &lt;code&gt;&amp;lt;nixpkgs&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{}:&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; 
  &lt;span class="nv"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt; 
&lt;span class="kn"&gt;in&lt;/span&gt; 
  &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;stdenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mkDerivation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;a &lt;code&gt;&amp;lt;nixpkgs&amp;gt;&lt;/code&gt; vai ser valorada pra ao path onde está a sua versão do nixpkgs, com isso, a função &lt;code&gt;import&lt;/code&gt; vai pegar o caminho recebido, ler o &lt;code&gt;arquivo.nix&lt;/code&gt; lá e valorar a expressão nix lá dentro, retornando o valor resultando. No caso, esse valor resultante é uma função, que alimentamos, novamente, com um conjunto vazio de atributos. &lt;/p&gt;

&lt;p&gt;Feito isso, podemos tentar buildar novamente para receber:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ nix-build unidef.nix 
error: derivation name missing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;:P, faltou dar um nome propacote, vamos lá:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{}:&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; 
  &lt;span class="nv"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt; 
&lt;span class="kn"&gt;in&lt;/span&gt; 
  &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;stdenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mkDerivation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;pname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unicodef"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bom, o erro de pacote sem nome não vai mais aparecer, mas &lt;em&gt;spoiler&lt;/em&gt;: ainda não vai rodar. Claro! Não fornecemos nenhum pacote :p. Para isso, usaremos outra função disponível no &lt;code&gt;nixpkgs&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{}:&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; 
  &lt;span class="nv"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt; 
&lt;span class="kn"&gt;in&lt;/span&gt; 
  &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;stdenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mkDerivation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;pname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unicodef"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c"&gt;# https://github.com/tsouanas/unicodef&lt;/span&gt;
  &lt;span class="nv"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;fetchFromGitHub&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tsouanas"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;repo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unicodef"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;rev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de tentar rodar de novo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ nix-build unidef.nix 
warning: found empty &lt;span class="nb"&gt;hash&lt;/span&gt;, assuming &lt;span class="s1"&gt;'sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='&lt;/span&gt;
these 2 derivations will be built:
  /nix/store/qvcsg0f9x2l9nh70w7lrmksc726k9gf5-source.drv
  /nix/store/dplp4jgg7km5kzvi37fj99k8544v1gm5-unicodef-0.1.drv
building &lt;span class="s1"&gt;'/nix/store/qvcsg0f9x2l9nh70w7lrmksc726k9gf5-source.drv'&lt;/span&gt;...

trying https://github.com/tsouanas/unicodef/archive/master.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 &lt;span class="nt"&gt;--&lt;/span&gt;:--:-- &lt;span class="nt"&gt;--&lt;/span&gt;:--:-- &lt;span class="nt"&gt;--&lt;/span&gt;:--:--     0
100  8395    0  8395    0     0  11019      0 &lt;span class="nt"&gt;--&lt;/span&gt;:--:-- &lt;span class="nt"&gt;--&lt;/span&gt;:--:-- &lt;span class="nt"&gt;--&lt;/span&gt;:--:-- 43051
unpacking &lt;span class="nb"&gt;source &lt;/span&gt;archive /build/download.tar.gz
error: &lt;span class="nb"&gt;hash &lt;/span&gt;mismatch &lt;span class="k"&gt;in &lt;/span&gt;fixed-output derivation &lt;span class="s1"&gt;'/nix/store/qvcsg0f9x2l9nh70w7lrmksc726k9gf5-source.drv'&lt;/span&gt;:
         specified: sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&lt;span class="o"&gt;=&lt;/span&gt;
            got:    sha256-fMV/KTKvD32Fp+WHtwMoT9x5yTOkv7q/8ddKSQ3FyAw&lt;span class="o"&gt;=&lt;/span&gt;
error: 1 dependencies of derivation &lt;span class="s1"&gt;'/nix/store/dplp4jgg7km5kzvi37fj99k8544v1gm5-unicodef-0.1.drv'&lt;/span&gt; failed to build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lendo a mensagem, a Nix está nos ajudando a identificar a sha256 correta. Essa hash é importante pra dar segurança, no futuro, de que o arquivo baixado não foi corrompido, de que o conteúdo não foi alterado maliciosamente (ataques MITM) e tem a seguinte propriedade: sempre que alguém baixar o mesmo commit, o hash será o mesmo. Com isso, ficamos com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{}:&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; 
  &lt;span class="nv"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="c"&gt;# pyinstaller = pkgs.python313Packages.pyinstaller; &lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt; 
  &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;stdenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mkDerivation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;pname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unicodef"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"0.1"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;fetchFromGitHub&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tsouanas"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;repo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unicodef"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;rev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;sha256&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sha256-fMV/KTKvD32Fp+WHtwMoT9x5yTOkv7q/8ddKSQ3FyAw="&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tentando rodar novamente acarretará em outro erro :P:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;error: builder &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;'/nix/store/gqka5j79bni4mz4m0fy8jjnh17pwcypd-unicodef-0.1.drv'&lt;/span&gt; failed to produce output path &lt;span class="k"&gt;for &lt;/span&gt;output &lt;span class="s1"&gt;'out'&lt;/span&gt; at &lt;span class="s1"&gt;'/nix/store/gqka5j79bni4mz4m0fy8jjnh17pwcypd-unicodef-0.1.drv.chroot/root/nix/store/l1nzpz517j87gzdmmfrylvzkfsw8fw91-unicodef-0.1'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa é talvez a parte mais complicada até agora e, com isso, o nosso exemplo vai ajudar :). O que está faltando, de uma forma muito resumida, é um detalhamento de como criar/produzir um output. Para isso, vamos fornecer informações adicionais. &lt;/p&gt;

&lt;p&gt;No nosso exemplo, felizmente, o unicodef vai ser só um arquivo &lt;code&gt;unicodef.py&lt;/code&gt;, cuja única orientação fornecida, será a de rodá-lo. Para isso, iremos usar lib pra compilar o código python e, manualmente, colocaremos esse resultado na saída correta, sem tomarmos mais tempo nesse passo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{}:&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; 
  &lt;span class="nv"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="nv"&gt;pyinstaller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;python313Packages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;pyinstaller&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="kn"&gt;in&lt;/span&gt; 
  &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;stdenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mkDerivation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;pname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unicodef"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"0.1"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;fetchFromGitHub&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tsouanas"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;repo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unicodef"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;rev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;sha256&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sha256-fMV/KTKvD32Fp+WHtwMoT9x5yTOkv7q/8ddKSQ3FyAw="&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="nv"&gt;buildInputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;pyinstaller&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="nv"&gt;installPhase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;''&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;     runHook preInstall&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;     mkdir -p $out/bin&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;     pyinstaller --name unicodef --onefile unicodef.py --distpath $out/bin&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;     runHook postInstall&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;    ''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com esses passos detalhados no atributo &lt;code&gt;installPhase&lt;/code&gt; e com as dependências descritas no &lt;code&gt;buildInputs&lt;/code&gt;, agora vai dar certo :).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ nix-build unicodef.nix 
/nix/store/lbmpz84l8z0jyyi2qln3lxc2vv3qdpcl-unicodef-0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉🎉🎉🎉! Com isso, um symlink foi criado para o caminho na nix-store onde o nosso pacote foi criado :).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ ll
lrwxrwxrwx jjoaoll &lt;span class="nb"&gt;users  &lt;/span&gt;56 B Thu Aug  7 15:36:33 2025  result ⇒ /nix/store/lbmpz84l8z0jyyi2qln3lxc2vv3qdpcl-unicodef-0.1
.rw-r--r-- jjoaoll &lt;span class="nb"&gt;users &lt;/span&gt;908 B Thu Aug  7 12:02:07 2025  unicodef.nix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para acessá-lo, fazemos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ ./result/bin/unicodef &lt;span class="nt"&gt;-h&lt;/span&gt;
usage: unicodef &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-h&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-v&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; INFILE &lt;span class="o"&gt;[&lt;/span&gt;INFILE ...] OUTDIR

Generate Markdown, XCompose, vim, and macOS dict files.

positional arguments:
  INFILE         input files
  OUTDIR         directory to place output files

options:
  &lt;span class="nt"&gt;-h&lt;/span&gt;, &lt;span class="nt"&gt;--help&lt;/span&gt;     show this &lt;span class="nb"&gt;help &lt;/span&gt;message and &lt;span class="nb"&gt;exit&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt;, &lt;span class="nt"&gt;--verbose&lt;/span&gt;  verbose output

URL: https://github.com/tsouanas/unicodef
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FIM
&lt;/h2&gt;

</description>
      <category>nix</category>
      <category>packaging</category>
      <category>functional</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
