docs/Nixpkgs/Languages-And-Frameworks/beam.section/index.html

3196 lines
80 KiB
HTML
Raw Permalink Normal View History

2024-07-24 19:14:02 +00:00
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Aux Documentation">
<meta name="author" content="Nixpkgs Aux, and Lix Contributors">
<link rel="canonical" href="https://docs.auxolotl.org/Nixpkgs/Languages-And-Frameworks/beam.section/">
<link rel="prev" href="../android.section/">
<link rel="next" href="../bower.section/">
<link rel="icon" href="../../../assets/aux-logo.svg">
<meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.29">
<title>BEAM Languages (Erlang, Elixir & LFE) - Aux Docs</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.76a95c52.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.bunny.net/css?family=IBM+Plex+Sans:300,300i,400,400i,700,700i%7CIBM+Plex+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"IBM Plex Sans";--md-code-font:"IBM Plex Mono"}</style>
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta property="og:type" content="website" >
<meta property="og:title" content="BEAM Languages (Erlang, Elixir & LFE) {#sec-beam} - Aux Docs" >
<meta property="og:description" content="Aux Documentation" >
<meta property="og:image" content="https://docs.auxolotl.org/assets/images/social/Nixpkgs/Languages-And-Frameworks/beam.section.png" >
<meta property="og:image:type" content="image/png" >
<meta property="og:image:width" content="1200" >
<meta property="og:image:height" content="630" >
<meta property="og:url" content="https://docs.auxolotl.org/Nixpkgs/Languages-And-Frameworks/beam.section/" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="BEAM Languages (Erlang, Elixir & LFE) {#sec-beam} - Aux Docs" >
<meta name="twitter:description" content="Aux Documentation" >
<meta name="twitter:image" content="https://docs.auxolotl.org/assets/images/social/Nixpkgs/Languages-And-Frameworks/beam.section.png" >
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#sec-beam" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="Aux Docs" class="md-header__button md-logo" aria-label="Aux Docs" data-md-component="logo">
<img src="../../../assets/aux-logo.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Aux Docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
BEAM Languages (Erlang, Elixir &amp; LFE)
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Dark Mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Dark Mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Light Mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Light Mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
</label>
</form>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Aux Documentation Hub
</a>
</li>
<li class="md-tabs__item">
<a href="../../../TODO/" class="md-tabs__link">
TODO
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Aux/" class="md-tabs__link">
Aux
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Lix/" class="md-tabs__link">
Lix
</a>
</li>
<li class="md-tabs__item">
<a href="../../../NixOS/appstream/" class="md-tabs__link">
NixOS
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../" class="md-tabs__link">
Nixpkgs
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="Aux Docs" class="md-nav__button md-logo" aria-label="Aux Docs" data-md-component="logo">
<img src="../../../assets/aux-logo.svg" alt="logo">
</a>
Aux Docs
</label>
<div class="md-nav__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Aux Documentation Hub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../TODO/" class="md-nav__link">
<span class="md-ellipsis">
TODO
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Aux/" class="md-nav__link">
<span class="md-ellipsis">
Aux
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Lix/" class="md-nav__link">
<span class="md-ellipsis">
Lix
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../NixOS/appstream/" class="md-nav__link">
<span class="md-ellipsis">
NixOS
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<div class="md-nav__link md-nav__container">
<a href="../../" class="md-nav__link ">
<span class="md-ellipsis">
Nixpkgs
</span>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Nixpkgs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../options/" class="md-nav__link">
<span class="md-ellipsis">
Options
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Build-Helpers/" class="md-nav__link">
<span class="md-ellipsis">
Build Helpers
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Development/" class="md-nav__link">
<span class="md-ellipsis">
Development
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Functions/" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Hooks/" class="md-nav__link">
<span class="md-ellipsis">
Hooks
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_7" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Languages And Frameworks
</span>
</a>
<label class="md-nav__link " for="__nav_6_7" id="__nav_6_7_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_7_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6_7">
<span class="md-nav__icon md-icon"></span>
Languages And Frameworks
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../agda.section/" class="md-nav__link">
<span class="md-ellipsis">
Agda
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../android.section/" class="md-nav__link">
<span class="md-ellipsis">
Android
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
BEAM Languages (Erlang, Elixir &amp; LFE)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
BEAM Languages (Erlang, Elixir &amp; LFE)
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#beam-introduction" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#available-versions-and-deprecations-schedule" class="md-nav__link">
<span class="md-ellipsis">
Available versions and deprecations schedule
</span>
</a>
<nav class="md-nav" aria-label="Available versions and deprecations schedule">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#elixir" class="md-nav__link">
<span class="md-ellipsis">
Elixir
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#beam-structure" class="md-nav__link">
<span class="md-ellipsis">
Structure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build-tools" class="md-nav__link">
<span class="md-ellipsis">
Build Tools
</span>
</a>
<nav class="md-nav" aria-label="Build Tools">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#build-tools-rebar3" class="md-nav__link">
<span class="md-ellipsis">
Rebar3
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build-tools-other" class="md-nav__link">
<span class="md-ellipsis">
Mix &amp; Erlang.mk
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#how-to-install-beam-packages" class="md-nav__link">
<span class="md-ellipsis">
How to Install BEAM Packages
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../bower.section/" class="md-nav__link">
<span class="md-ellipsis">
Bower
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../chicken.section/" class="md-nav__link">
<span class="md-ellipsis">
CHICKEN
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../coq.section/" class="md-nav__link">
<span class="md-ellipsis">
Coq and coq packages
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../crystal.section/" class="md-nav__link">
<span class="md-ellipsis">
Crystal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cuda.section/" class="md-nav__link">
<span class="md-ellipsis">
CUDA
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cuelang.section/" class="md-nav__link">
<span class="md-ellipsis">
Cue (Cuelang)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dart.section/" class="md-nav__link">
<span class="md-ellipsis">
Dart
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dhall.section/" class="md-nav__link">
<span class="md-ellipsis">
Dhall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dlang.section/" class="md-nav__link">
<span class="md-ellipsis">
D (Dlang)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dotnet.section/" class="md-nav__link">
<span class="md-ellipsis">
Dotnet
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../emscripten.section/" class="md-nav__link">
<span class="md-ellipsis">
Emscripten
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../gnome.section/" class="md-nav__link">
<span class="md-ellipsis">
GNOME
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../go.section/" class="md-nav__link">
<span class="md-ellipsis">
Go
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../gradle.section/" class="md-nav__link">
<span class="md-ellipsis">
Gradle
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hare.section/" class="md-nav__link">
<span class="md-ellipsis">
Hare
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../haskell.section/" class="md-nav__link">
<span class="md-ellipsis">
Haskell
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hy.section/" class="md-nav__link">
<span class="md-ellipsis">
Hy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../idris.section/" class="md-nav__link">
<span class="md-ellipsis">
Idris
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../idris2.section/" class="md-nav__link">
<span class="md-ellipsis">
Idris2
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ios.section/" class="md-nav__link">
<span class="md-ellipsis">
iOS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../java.section/" class="md-nav__link">
<span class="md-ellipsis">
Java
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../javascript.section/" class="md-nav__link">
<span class="md-ellipsis">
Javascript
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../julia.section/" class="md-nav__link">
<span class="md-ellipsis">
Julia
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lisp.section/" class="md-nav__link">
<span class="md-ellipsis">
lisp-modules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lua.section/" class="md-nav__link">
<span class="md-ellipsis">
Lua
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../maven.section/" class="md-nav__link">
<span class="md-ellipsis">
Maven
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nim.section/" class="md-nav__link">
<span class="md-ellipsis">
Nim
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ocaml.section/" class="md-nav__link">
<span class="md-ellipsis">
OCaml
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../octave.section/" class="md-nav__link">
<span class="md-ellipsis">
Octave
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../perl.section/" class="md-nav__link">
<span class="md-ellipsis">
Perl
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../php.section/" class="md-nav__link">
<span class="md-ellipsis">
PHP
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pkg-config.section/" class="md-nav__link">
<span class="md-ellipsis">
pkg-config
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../python.section/" class="md-nav__link">
<span class="md-ellipsis">
Python
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../qt.section/" class="md-nav__link">
<span class="md-ellipsis">
Qt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../r.section/" class="md-nav__link">
<span class="md-ellipsis">
R
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ruby.section/" class="md-nav__link">
<span class="md-ellipsis">
Ruby
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../rust.section/" class="md-nav__link">
<span class="md-ellipsis">
Rust
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scheme.section/" class="md-nav__link">
<span class="md-ellipsis">
Scheme
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../swift.section/" class="md-nav__link">
<span class="md-ellipsis">
Swift
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../texlive.section/" class="md-nav__link">
<span class="md-ellipsis">
TeX Live
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../titanium.section/" class="md-nav__link">
<span class="md-ellipsis">
Titanium
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../vim.section/" class="md-nav__link">
<span class="md-ellipsis">
Vim
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Library-Reference/asserts/" class="md-nav__link">
<span class="md-ellipsis">
Library Reference
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Module-System/module-system.chapter/" class="md-nav__link">
<span class="md-ellipsis">
Module System
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Packages/" class="md-nav__link">
<span class="md-ellipsis">
Packages
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Standard-Environment/" class="md-nav__link">
<span class="md-ellipsis">
Standard Environment
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Using-Nixpkgs/" class="md-nav__link">
<span class="md-ellipsis">
Using Nixpkgs
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#beam-introduction" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#available-versions-and-deprecations-schedule" class="md-nav__link">
<span class="md-ellipsis">
Available versions and deprecations schedule
</span>
</a>
<nav class="md-nav" aria-label="Available versions and deprecations schedule">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#elixir" class="md-nav__link">
<span class="md-ellipsis">
Elixir
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#beam-structure" class="md-nav__link">
<span class="md-ellipsis">
Structure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build-tools" class="md-nav__link">
<span class="md-ellipsis">
Build Tools
</span>
</a>
<nav class="md-nav" aria-label="Build Tools">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#build-tools-rebar3" class="md-nav__link">
<span class="md-ellipsis">
Rebar3
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build-tools-other" class="md-nav__link">
<span class="md-ellipsis">
Mix &amp; Erlang.mk
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#how-to-install-beam-packages" class="md-nav__link">
<span class="md-ellipsis">
How to Install BEAM Packages
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="sec-beam">BEAM Languages (Erlang, Elixir &amp; LFE)</h1>
<h2 id="beam-introduction">Introduction</h2>
<p>In this document and related Nix expressions, we use the term, <em>BEAM</em>, to describe the environment. BEAM is the name of the Erlang Virtual Machine and, as far as we're concerned, from a packaging perspective, all languages that run on the BEAM are interchangeable. That which varies, like the build system, is transparent to users of any given BEAM package, so we make no distinction.</p>
<h2 id="available-versions-and-deprecations-schedule">Available versions and deprecations schedule</h2>
<h3 id="elixir">Elixir</h3>
<p>nixpkgs follows the <a href="https://hexdocs.pm/elixir/compatibility-and-deprecations.html">official elixir deprecation schedule</a> and keeps the last 5 released versions of Elixir available.</p>
<h2 id="beam-structure">Structure</h2>
<p>All BEAM-related expressions are available via the top-level <code>beam</code> attribute, which includes:</p>
<ul>
<li>
<p><code>interpreters</code>: a set of compilers running on the BEAM, including multiple Erlang/OTP versions (<code>beam.interpreters.erlang_22</code>, etc), Elixir (<code>beam.interpreters.elixir</code>) and LFE (Lisp Flavoured Erlang) (<code>beam.interpreters.lfe</code>).</p>
</li>
<li>
<p><code>packages</code>: a set of package builders (Mix and rebar3), each compiled with a specific Erlang/OTP version, e.g. <code>beam.packages.erlang22</code>.</p>
</li>
</ul>
<p>The default Erlang compiler, defined by <code>beam.interpreters.erlang</code>, is aliased as <code>erlang</code>. The default BEAM package set is defined by <code>beam.packages.erlang</code> and aliased at the top level as <code>beamPackages</code>.</p>
<p>To create a package builder built with a custom Erlang version, use the lambda, <code>beam.packagesWith</code>, which accepts an Erlang/OTP derivation and produces a package builder similar to <code>beam.packages.erlang</code>.</p>
<p>Many Erlang/OTP distributions available in <code>beam.interpreters</code> have versions with ODBC and/or Java enabled or without wx (no observer support). For example, there's <code>beam.interpreters.erlang_22_odbc_javac</code>, which corresponds to <code>beam.interpreters.erlang_22</code> and <code>beam.interpreters.erlang_22_nox</code>, which corresponds to <code>beam.interpreters.erlang_22</code>.</p>
<h2 id="build-tools">Build Tools</h2>
<h3 id="build-tools-rebar3">Rebar3</h3>
<p>We provide a version of Rebar3, under <code>rebar3</code>. We also provide a helper to fetch Rebar3 dependencies from a lockfile under <code>fetchRebar3Deps</code>.</p>
<p>We also provide a version on Rebar3 with plugins included, under <code>rebar3WithPlugins</code>. This package is a function which takes two arguments: <code>plugins</code>, a list of nix derivations to include as plugins (loaded only when specified in <code>rebar.config</code>), and <code>globalPlugins</code>, which should always be loaded by rebar3. Example: <code>rebar3WithPlugins { globalPlugins = [beamPackages.pc]; }</code>.</p>
<p>When adding a new plugin it is important that the <code>packageName</code> attribute is the same as the atom used by rebar3 to refer to the plugin.</p>
<h3 id="build-tools-other">Mix &amp; Erlang.mk</h3>
<p>Erlang.mk works exactly as expected. There is a bootstrap process that needs to be run, which is supported by the <code>buildErlangMk</code> derivation.</p>
<p>For Elixir applications use <code>mixRelease</code> to make a release. See examples for more details.</p>
<p>There is also a <code>buildMix</code> helper, whose behavior is closer to that of <code>buildErlangMk</code> and <code>buildRebar3</code>. The primary difference is that mixRelease makes a release, while buildMix only builds the package, making it useful for libraries and other dependencies.</p>
<h2 id="how-to-install-beam-packages">How to Install BEAM Packages</h2>
<p>BEAM builders are not registered at the top level, because they are not relevant to the vast majority of Nix users.
To use any of those builders into your environment, refer to them by their attribute path under <code>beamPackages</code>, e.g. <code>beamPackages.rebar3</code>:</p>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Ephemeral shell
</code></pre></div>
<div class="highlight"><pre><span></span><code>$ nix-shell -p beamPackages.rebar3
</code></pre></div>
</div>
<div class="admonition example">
<p class="admonition-title">Example</p>
<h1 id="declarative-shell">Declarative shell</h1>
</div>
<div class="highlight"><pre><span></span><code><span class="k">let</span>
<span class="ss">pkgs</span> <span class="o">=</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{</span> <span class="ss">config</span> <span class="o">=</span> <span class="p">{};</span> <span class="ss">overlays</span> <span class="o">=</span> <span class="p">[];</span> <span class="p">};</span>
<span class="k">in</span>
pkgs<span class="o">.</span>mkShell <span class="p">{</span>
<span class="ss">packages</span> <span class="o">=</span> <span class="p">[</span> pkgs<span class="o">.</span>beamPackages<span class="o">.</span>rebar3 <span class="p">];</span>
<span class="p">}</span>
</code></pre></div>
<h2 id="packaging-beam-applications">Packaging BEAM Applications</h2>
<h3 id="packaging-erlang-applications">Erlang Applications</h3>
<h4 id="rebar3-packages">Rebar3 Packages</h4>
<p>The Nix function, <code>buildRebar3</code>, defined in <code>beam.packages.erlang.buildRebar3</code> and aliased at the top level, can be used to build a derivation that understands how to build a Rebar3 project.</p>
<p>If a package needs to compile native code via Rebar3's port compilation mechanism, add <code>compilePort = true;</code> to the derivation.</p>
<h4 id="erlang-mk-packages">Erlang.mk Packages</h4>
<p>Erlang.mk functions similarly to Rebar3, except we use <code>buildErlangMk</code> instead of <code>buildRebar3</code>.</p>
<h4 id="mix-packages">Mix Packages</h4>
<p><code>mixRelease</code> is used to make a release in the mix sense. Dependencies will need to be fetched with <code>fetchMixDeps</code> and passed to it.</p>
<h4 id="mix-release-elixir-phoenix-example">mixRelease - Elixir Phoenix example</h4>
<p>there are 3 steps, frontend dependencies (javascript), backend dependencies (elixir) and the final derivation that puts both of those together</p>
<h5 id="mix-release-javascript-deps">mixRelease - Frontend dependencies (javascript)</h5>
<p>For phoenix projects, inside of nixpkgs you can either use yarn2nix (mkYarnModule) or node2nix. An example with yarn2nix can be found <a href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/servers/web-apps/plausible/default.nix#L39">here</a>. An example with node2nix will follow. To package something outside of nixpkgs, you have alternatives like <a href="https://github.com/nix-community/npmlock2nix">npmlock2nix</a> or <a href="https://github.com/serokell/nix-npm-buildpackage">nix-npm-buildpackage</a></p>
<h5 id="mix-release-mix-deps">mixRelease - backend dependencies (mix)</h5>
<p>There are 2 ways to package backend dependencies. With mix2nix and with a fixed-output-derivation (FOD).</p>
<h6 id="mix2nix">mix2nix</h6>
<p><code>mix2nix</code> is a cli tool available in nixpkgs. it will generate a nix expression from a mix.lock file. It is quite standard in the 2nix tool series.</p>
<p>Note that currently mix2nix can't handle git dependencies inside the mix.lock file. If you have git dependencies, you can either add them manually (see <a href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/servers/pleroma/default.nix#L20">example</a>) or use the FOD method.</p>
<p>The advantage of using mix2nix is that nix will know your whole dependency graph. On a dependency update, this won't trigger a full rebuild and download of all the dependencies, where FOD will do so.</p>
<p>Practical steps:</p>
<ul>
<li>run <code>mix2nix &gt; mix_deps.nix</code> in the upstream repo.</li>
<li>pass <code>mixNixDeps = with pkgs; import ./mix_deps.nix { inherit lib beamPackages; };</code> as an argument to mixRelease.</li>
</ul>
<p>If there are git dependencies.</p>
<ul>
<li>You'll need to fix the version artificially in mix.exs and regenerate the mix.lock with fixed version (on upstream). This will enable you to run <code>mix2nix &gt; mix_deps.nix</code>.</li>
<li>From the mix_deps.nix file, remove the dependencies that had git versions and pass them as an override to the import function.</li>
</ul>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="ss">mixNixDeps</span> <span class="o">=</span> <span class="nb">import</span> <span class="l">./mix.nix</span> <span class="p">{</span>
<span class="k">inherit</span> beamPackages lib<span class="p">;</span>
<span class="ss">overrides</span> <span class="o">=</span> <span class="p">(</span>final<span class="p">:</span> prev<span class="p">:</span> <span class="p">{</span>
<span class="c1"># mix2nix does not support git dependencies yet,</span>
<span class="c1"># so we need to add them manually</span>
<span class="ss">prometheus_ex</span> <span class="o">=</span> beamPackages<span class="o">.</span>buildMix <span class="k">rec</span> <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;prometheus_ex&quot;</span><span class="p">;</span>
<span class="ss">version</span> <span class="o">=</span> <span class="s2">&quot;3.0.5&quot;</span><span class="p">;</span>
<span class="c1"># Change the argument src with the git src that you actually need</span>
<span class="ss">src</span> <span class="o">=</span> fetchFromGitLab <span class="p">{</span>
<span class="ss">domain</span> <span class="o">=</span> <span class="s2">&quot;git.pleroma.social&quot;</span><span class="p">;</span>
<span class="ss">group</span> <span class="o">=</span> <span class="s2">&quot;pleroma&quot;</span><span class="p">;</span>
<span class="ss">owner</span> <span class="o">=</span> <span class="s2">&quot;elixir-libraries&quot;</span><span class="p">;</span>
<span class="ss">repo</span> <span class="o">=</span> <span class="s2">&quot;prometheus.ex&quot;</span><span class="p">;</span>
<span class="ss">rev</span> <span class="o">=</span> <span class="s2">&quot;a4e9beb3c1c479d14b352fd9d6dd7b1f6d7deee5&quot;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-U17LlN6aGUKUFnT4XyYXppRN+TvUBIBRHEUsfeIiGOw=&quot;</span><span class="p">;</span>
<span class="p">};</span>
<span class="c1"># you can re-use the same beamDeps argument as generated</span>
<span class="ss">beamDeps</span> <span class="o">=</span> <span class="k">with</span> final<span class="p">;</span> <span class="p">[</span> prometheus <span class="p">];</span>
<span class="p">};</span>
<span class="p">});</span>
<span class="p">};</span>
<span class="p">}</span>
</code></pre></div>
<p>You will need to run the build process once to fix the hash to correspond to your new git src.</p>
<h6 id="fixed-output-derivation">FOD</h6>
<p>A fixed output derivation will download mix dependencies from the internet. To ensure reproducibility, a hash will be supplied. Note that mix is relatively reproducible. An FOD generating a different hash on each run hasn't been observed (as opposed to npm where the chances are relatively high). See <a href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/beam-modules/elixir-ls/default.nix">elixir-ls</a> for a usage example of FOD.</p>
<p>Practical steps</p>
<ul>
<li>start with the following argument to mixRelease</li>
</ul>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="ss">mixFodDeps</span> <span class="o">=</span> fetchMixDeps <span class="p">{</span>
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">&quot;mix-deps-</span><span class="si">${</span>pname<span class="si">}</span><span class="s2">&quot;</span><span class="p">;</span>
<span class="k">inherit</span> src version<span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> lib<span class="o">.</span>fakeHash<span class="p">;</span>
<span class="p">};</span>
<span class="p">}</span>
</code></pre></div>
<p>The first build will complain about the hash value, you can replace with the suggested value after that.</p>
<p>Note that if after you've replaced the value, nix suggests another hash, then mix is not fetching the dependencies reproducibly. An FOD will not work in that case and you will have to use mix2nix.</p>
<h5 id="mix-release-example">mixRelease - example</h5>
<p>Here is how your <code>default.nix</code> file would look for a phoenix project.</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{</span> <span class="p">};</span>
<span class="k">let</span>
<span class="c1"># beam.interpreters.erlang_26 is available if you need a particular version</span>
<span class="ss">packages</span> <span class="o">=</span> beam<span class="o">.</span>packagesWith beam<span class="o">.</span>interpreters<span class="o">.</span>erlang<span class="p">;</span>
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">&quot;your_project&quot;</span><span class="p">;</span>
<span class="ss">version</span> <span class="o">=</span> <span class="s2">&quot;0.0.1&quot;</span><span class="p">;</span>
<span class="ss">src</span> <span class="o">=</span> <span class="nb">builtins</span><span class="o">.</span>fetchgit <span class="p">{</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;ssh://git@github.com/your_id/your_repo&quot;</span><span class="p">;</span>
<span class="ss">rev</span> <span class="o">=</span> <span class="s2">&quot;replace_with_your_commit&quot;</span><span class="p">;</span>
<span class="p">};</span>
<span class="c1"># if using mix2nix you can use the mixNixDeps attribute</span>
<span class="ss">mixFodDeps</span> <span class="o">=</span> packages<span class="o">.</span>fetchMixDeps <span class="p">{</span>
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">&quot;mix-deps-</span><span class="si">${</span>pname<span class="si">}</span><span class="s2">&quot;</span><span class="p">;</span>
<span class="k">inherit</span> src version<span class="p">;</span>
<span class="c1"># nix will complain and tell you the right value to replace this with</span>
<span class="ss">hash</span> <span class="o">=</span> lib<span class="o">.</span>fakeHash<span class="p">;</span>
<span class="ss">mixEnv</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span> <span class="c1"># default is &quot;prod&quot;, when empty includes all dependencies, such as &quot;dev&quot;, &quot;test&quot;.</span>
<span class="c1"># if you have build time environment variables add them here</span>
<span class="ss">MY_ENV_VAR</span><span class="o">=</span><span class="s2">&quot;my_value&quot;</span><span class="p">;</span>
<span class="p">};</span>
<span class="ss">nodeDependencies</span> <span class="o">=</span> <span class="p">(</span>pkgs<span class="o">.</span>callPackage <span class="l">./assets/default.nix</span> <span class="p">{</span> <span class="p">})</span><span class="o">.</span>shell<span class="o">.</span>nodeDependencies<span class="p">;</span>
<span class="k">in</span> packages<span class="o">.</span>mixRelease <span class="p">{</span>
<span class="k">inherit</span> src pname version mixFodDeps<span class="p">;</span>
<span class="c1"># if you have build time environment variables add them here</span>
<span class="ss">MY_ENV_VAR</span><span class="o">=</span><span class="s2">&quot;my_value&quot;</span><span class="p">;</span>
<span class="ss">postBuild</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> ln -sf </span><span class="si">${</span>nodeDependencies<span class="si">}</span><span class="s s-Multiline">/lib/node_modules assets/node_modules</span>
<span class="s s-Multiline"> npm run deploy --prefix ./assets</span>
<span class="s s-Multiline"> # for external task you need a workaround for the no deps check flag</span>
<span class="s s-Multiline"> # https://github.com/phoenixframework/phoenix/issues/2690</span>
<span class="s s-Multiline"> mix do deps.loadpaths --no-deps-check, phx.digest</span>
<span class="s s-Multiline"> mix phx.digest --no-deps-check</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Setup will require the following steps:</p>
<ul>
<li>Move your secrets to runtime environment variables. For more information refer to the <a href="https://hexdocs.pm/mix/Mix.Tasks.Release.html#module-runtime-configuration">runtime.exs docs</a>. On a fresh Phoenix build that would mean that both <code>DATABASE_URL</code> and <code>SECRET_KEY</code> need to be moved to <code>runtime.exs</code>.</li>
<li><code>cd assets</code> and <code>nix-shell -p node2nix --run "node2nix --development"</code> will generate a Nix expression containing your frontend dependencies</li>
<li>commit and push those changes</li>
<li>you can now <code>nix-build .</code></li>
<li>To run the release, set the <code>RELEASE_TMP</code> environment variable to a directory that your program has write access to. It will be used to store the BEAM settings.</li>
</ul>
<h4 id="example-of-creating-a-service-for-an-elixir-phoenix-project-example">Example of creating a service for an Elixir - Phoenix project!!! example</h4>
<p>In order to create a service with your release, you could add a <code>service.nix</code>
in your project with the following</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span>config<span class="p">,</span> pkgs<span class="p">,</span> lib<span class="p">,</span> <span class="o">...</span><span class="p">}:</span>
<span class="k">let</span>
<span class="ss">release</span> <span class="o">=</span> pkgs<span class="o">.</span>callPackage <span class="l">./default.nix</span><span class="p">;</span>
<span class="ss">release_name</span> <span class="o">=</span> <span class="s2">&quot;app&quot;</span><span class="p">;</span>
<span class="ss">working_directory</span> <span class="o">=</span> <span class="s2">&quot;/home/app&quot;</span><span class="p">;</span>
<span class="k">in</span>
<span class="p">{</span>
systemd<span class="o">.</span>services<span class="o">.</span><span class="si">${</span>release_name<span class="si">}</span> <span class="o">=</span> <span class="p">{</span>
<span class="ss">wantedBy</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;multi-user.target&quot;</span> <span class="p">];</span>
<span class="ss">after</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;network.target&quot;</span> <span class="s2">&quot;postgresql.service&quot;</span> <span class="p">];</span>
<span class="c1"># note that if you are connecting to a postgres instance on a different host</span>
<span class="c1"># postgresql.service should not be included in the requires.</span>
<span class="ss">requires</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;network-online.target&quot;</span> <span class="s2">&quot;postgresql.service&quot;</span> <span class="p">];</span>
<span class="ss">description</span> <span class="o">=</span> <span class="s2">&quot;my app&quot;</span><span class="p">;</span>
<span class="ss">environment</span> <span class="o">=</span> <span class="p">{</span>
<span class="c1"># RELEASE_TMP is used to write the state of the</span>
<span class="c1"># VM configuration when the system is running</span>
<span class="c1"># it needs to be a writable directory</span>
<span class="ss">RELEASE_TMP</span> <span class="o">=</span> working_directory<span class="p">;</span>
<span class="c1"># can be generated in an elixir console with</span>
<span class="c1"># Base.encode32(:crypto.strong_rand_bytes(32))</span>
<span class="ss">RELEASE_COOKIE</span> <span class="o">=</span> <span class="s2">&quot;my_cookie&quot;</span><span class="p">;</span>
<span class="ss">MY_VAR</span> <span class="o">=</span> <span class="s2">&quot;my_var&quot;</span><span class="p">;</span>
<span class="p">};</span>
<span class="ss">serviceConfig</span> <span class="o">=</span> <span class="p">{</span>
<span class="ss">Type</span> <span class="o">=</span> <span class="s2">&quot;exec&quot;</span><span class="p">;</span>
<span class="ss">DynamicUser</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="ss">WorkingDirectory</span> <span class="o">=</span> working_directory<span class="p">;</span>
<span class="c1"># Implied by DynamicUser, but just to emphasize due to RELEASE_TMP</span>
<span class="ss">PrivateTmp</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="ss">ExecStart</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> </span><span class="si">${</span>release<span class="si">}</span><span class="s s-Multiline">/bin/</span><span class="si">${</span>release_name<span class="si">}</span><span class="s s-Multiline"> start</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">ExecStop</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> </span><span class="si">${</span>release<span class="si">}</span><span class="s s-Multiline">/bin/</span><span class="si">${</span>release_name<span class="si">}</span><span class="s s-Multiline"> stop</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">ExecReload</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> </span><span class="si">${</span>release<span class="si">}</span><span class="s s-Multiline">/bin/</span><span class="si">${</span>release_name<span class="si">}</span><span class="s s-Multiline"> restart</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">Restart</span> <span class="o">=</span> <span class="s2">&quot;on-failure&quot;</span><span class="p">;</span>
<span class="ss">RestartSec</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>
<span class="ss">StartLimitBurst</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
<span class="ss">StartLimitInterval</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
<span class="p">};</span>
<span class="c1"># disksup requires bash</span>
<span class="ss">path</span> <span class="o">=</span> <span class="p">[</span> pkgs<span class="o">.</span>bash <span class="p">];</span>
<span class="p">};</span>
<span class="c1"># in case you have migration scripts or you want to use a remote shell</span>
environment<span class="o">.</span><span class="ss">systemPackages</span> <span class="o">=</span> <span class="p">[</span> release <span class="p">];</span>
<span class="p">}</span>
</code></pre></div>
<h2 id="how-to-develop">How to Develop</h2>
<h3 id="creating-a-shell">Creating a Shell</h3>
<p>Usually, we need to create a <code>shell.nix</code> file and do our development inside of the environment specified therein. Just install your version of Erlang and any other interpreters, and then use your normal build tools. As an example with Elixir:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> pkgs <span class="o">?</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{}</span> <span class="p">}:</span>
<span class="k">with</span> pkgs<span class="p">;</span>
<span class="k">let</span>
<span class="ss">elixir</span> <span class="o">=</span> beam<span class="o">.</span>packages<span class="o">.</span>erlang_24<span class="o">.</span>elixir_1_12<span class="p">;</span>
<span class="k">in</span>
mkShell <span class="p">{</span>
<span class="ss">buildInputs</span> <span class="o">=</span> <span class="p">[</span> elixir <span class="p">];</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="beam-using-overlays">Using an overlay</h3>
<p>If you need to use an overlay to change some attributes of a derivation, e.g. if you need a bugfix from a version that is not yet available in nixpkgs, you can override attributes such as <code>version</code> (and the corresponding <code>hash</code>) and then use this overlay in your development environment:</p>
<h4 id="beam-using-overlays-shell.nix"><code>shell.nix</code></h4>
<div class="highlight"><pre><span></span><code><span class="k">let</span>
<span class="ss">elixir_1_13_1_overlay</span> <span class="o">=</span> <span class="p">(</span>self<span class="p">:</span> super<span class="p">:</span> <span class="p">{</span>
<span class="ss">elixir_1_13</span> <span class="o">=</span> super<span class="o">.</span>elixir_1_13<span class="o">.</span>override <span class="p">{</span>
<span class="ss">version</span> <span class="o">=</span> <span class="s2">&quot;1.13.1&quot;</span><span class="p">;</span>
<span class="ss">sha256</span> <span class="o">=</span> <span class="s2">&quot;sha256-t0ic1LcC7EV3avWGdR7VbyX7pGDpnJSW1ZvwvQUPC3w=&quot;</span><span class="p">;</span>
<span class="p">};</span>
<span class="p">});</span>
<span class="ss">pkgs</span> <span class="o">=</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{</span> <span class="ss">overlays</span> <span class="o">=</span> <span class="p">[</span> elixir_1_13_1_overlay <span class="p">];</span> <span class="p">};</span>
<span class="k">in</span>
<span class="k">with</span> pkgs<span class="p">;</span>
mkShell <span class="p">{</span>
<span class="ss">buildInputs</span> <span class="o">=</span> <span class="p">[</span>
elixir_1_13
<span class="p">];</span>
<span class="p">}</span>
</code></pre></div>
<h4 id="elixir---phoenix-project">Elixir - Phoenix project</h4>
<p>Here is an example <code>shell.nix</code>.</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{</span> <span class="p">};</span>
<span class="k">let</span>
<span class="c1"># define packages to install</span>
<span class="ss">basePackages</span> <span class="o">=</span> <span class="p">[</span>
git
<span class="c1"># replace with beam.packages.erlang.elixir_1_13 if you need</span>
beam<span class="o">.</span>packages<span class="o">.</span>erlang<span class="o">.</span>elixir
nodejs
postgresql_14
<span class="c1"># only used for frontend dependencies</span>
<span class="c1"># you are free to use yarn2nix as well</span>
nodePackages<span class="o">.</span>node2nix
<span class="c1"># formatting js file</span>
nodePackages<span class="o">.</span>prettier
<span class="p">];</span>
<span class="ss">inputs</span> <span class="o">=</span> basePackages <span class="o">++</span> lib<span class="o">.</span>optionals stdenv<span class="o">.</span>isLinux <span class="p">[</span> inotify-tools <span class="p">]</span>
<span class="o">++</span> lib<span class="o">.</span>optionals stdenv<span class="o">.</span>isDarwin
<span class="p">(</span><span class="k">with</span> darwin<span class="o">.</span>apple_sdk<span class="o">.</span>frameworks<span class="p">;</span> <span class="p">[</span> CoreFoundation CoreServices <span class="p">]);</span>
<span class="c1"># define shell startup command</span>
<span class="ss">hooks</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> # this allows mix to work on the local directory</span>
<span class="s s-Multiline"> mkdir -p .nix-mix .nix-hex</span>
<span class="s s-Multiline"> export MIX_HOME=$PWD/.nix-mix</span>
<span class="s s-Multiline"> export HEX_HOME=$PWD/.nix-mix</span>
<span class="s s-Multiline"> # make hex from Nixpkgs available</span>
<span class="s s-Multiline"> # `mix local.hex` will install hex into MIX_HOME and should take precedence</span>
<span class="s s-Multiline"> export MIX_PATH=&quot;</span><span class="si">${</span>beam<span class="o">.</span>packages<span class="o">.</span>erlang<span class="o">.</span>hex<span class="si">}</span><span class="s s-Multiline">/lib/erlang/lib/hex/ebin&quot;</span>
<span class="s s-Multiline"> export PATH=$MIX_HOME/bin:$HEX_HOME/bin:$PATH</span>
<span class="s s-Multiline"> export LANG=C.UTF-8</span>
<span class="s s-Multiline"> # keep your shell history in iex</span>
<span class="s s-Multiline"> export ERL_AFLAGS=&quot;-kernel shell_history enabled&quot;</span>
<span class="s s-Multiline"> # postges related</span>
<span class="s s-Multiline"> # keep all your db data in a folder inside the project</span>
<span class="s s-Multiline"> export PGDATA=&quot;$PWD/db&quot;</span>
<span class="s s-Multiline"> # phoenix related env vars</span>
<span class="s s-Multiline"> export POOL_SIZE=15</span>
<span class="s s-Multiline"> export DB_URL=&quot;postgresql://postgres:postgres@localhost:5432/db&quot;</span>
<span class="s s-Multiline"> export PORT=4000</span>
<span class="s s-Multiline"> export MIX_ENV=dev</span>
<span class="s s-Multiline"> # add your project env vars here, word readable in the nix store.</span>
<span class="s s-Multiline"> export ENV_VAR=&quot;your_env_var&quot;</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="k">in</span> mkShell <span class="p">{</span>
<span class="ss">buildInputs</span> <span class="o">=</span> inputs<span class="p">;</span>
<span class="ss">shellHook</span> <span class="o">=</span> hooks<span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Initializing the project will require the following steps:</p>
<ul>
<li>create the db directory <code>initdb ./db</code> (inside your mix project folder)</li>
<li>create the postgres user <code>createuser postgres -ds</code></li>
<li>create the db <code>createdb db</code></li>
<li>start the postgres instance <code>pg_ctl -l "$PGDATA/server.log" start</code></li>
<li>add the <code>/db</code> folder to your <code>.gitignore</code></li>
<li>you can start your phoenix server and get a shell with <code>iex -S mix phx.server</code></li>
</ul>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Licenced MIT
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://git.auxolotl.org/auxolotl/docs" target="_blank" rel="noopener" title="Aux Docs Repo" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</a>
<a href="https://forum.aux.computer/" target="_blank" rel="noopener" title="Aux Forum" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.103 0C18.666 0 24 5.485 24 11.997c0 6.51-5.33 11.99-11.9 11.99L0 24V11.79C0 5.28 5.532 0 12.103 0zm.116 4.563a7.395 7.395 0 0 0-6.337 3.57 7.247 7.247 0 0 0-.148 7.22L4.4 19.61l4.794-1.074a7.424 7.424 0 0 0 8.136-1.39 7.256 7.256 0 0 0 1.737-7.997 7.375 7.375 0 0 0-6.84-4.585h-.008z"/></svg>
</a>
<a href="https://wiki.auxolotl.org/" target="_blank" rel="noopener" title="Aux Wiki" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17.801 13.557c.148.098.288.202.417.313 1.854 1.6 3.127 4.656 2.582 7.311-1.091-.255-5.747-1.055-7.638-3.383-.91-1.12-1.366-2.081-1.569-2.885a5.65 5.65 0 0 0 .034-.219c.089.198.197.35.313.466.24.24.521.335.766.372.304.046.594-.006.806-.068l.001.001c.05-.015.433-.116.86-.342.325-.173 2.008-.931 3.428-1.566Zm-7.384 1.435C9.156 16.597 6.6 18.939.614 18.417c.219-1.492 1.31-3.019 2.51-4.11.379-.345.906-.692 1.506-1.009.286.168.598.332.939.486 2.689 1.221 3.903 1.001 4.89.573a1.3 1.3 0 0 0 .054-.025 6.156 6.156 0 0 0-.096.66Zm4.152-.462c.38-.341.877-.916 1.383-1.559-.389-.15-.866-.371-1.319-.591-.598-.29-1.305-.283-2.073-.315a4.685 4.685 0 0 1-.804-.103c.014-.123.027-.246.038-.369.062.104.673.057.871.057.354 0 1.621.034 3.074-.574 1.452-.608 2.55-1.706 3.022-3.225.474-1.52.22-3.091-.168-3.952-.169.709-1.453 2.381-1.926 2.871-.473.489-2.381 2.296-2.972 2.921-.7.74-.688.793-1.332 1.302-.202.19-.499.402-.563.53.027-.338.039-.675.027-.997a7.653 7.653 0 0 0-.032-.523c.322-.059.567-.522.567-.861 0-.224-.106-.247-.271-.229.075-.894.382-3.923 1.254-4.281.218.109.831.068.649-.295-.182-.364-.825-.074-1.081.266-.28.374-.956 2.046-.92 4.324-.113.014-.174.033-.322.033-.171 0-.321-.04-.433-.05.034-2.275-.714-3.772-.84-4.169-.12-.375-.491-.596-.781-.596-.146 0-.272.056-.333.179-.182.363.459.417.677.308.706.321 1.156 3.519 1.254 4.277-.125-.006-.199.035-.199.233 0 .311.17.756.452.843a.442.442 0 0 0-.007.03s-.287.99-.413 2.189a4.665 4.665 0 0 1-.718-.225c-.714-.286-1.355-.583-2.019-.566-.664.018-1.366.023-1.804-.036-.438-.058-.649-.15-.649-.15s-.234.365.257 1.075c.42.607 1.055 1.047 1.644 1.18.589.134 1.972.18 2.785-.377.16-.109.317-.228.459-.34a8.717 8.717 0 0 0-.013.626c-.289.753-.571 1.993-.268 3.338 0-.001.701-.842.787-2.958.006-.144.009-.271.01-.383.052-.248.103-.518.148-.799.072.135.151.277.234.413.511.842 1.791 1.37 2.383 1.49.091.019.187.032.285.038Zm-1.12.745c-.188.055-.445.1-.713.059-.21-.031-.45-.11-.655-.316-.169-.168-.312-.419-.401-.789a9.837 9.837 0 0 0 .039-.82l.049-.243c.563.855 1.865 1.398 2.476 1.522.036.008.072.014.109.02l-.013.009c-.579.415-.76.503-.891.558Zm6.333-2.818c-.257.114-4.111 1.822-5.246 2.363.98-.775 3.017-3.59 3.699-4.774 1.062.661 1.468 1.109 1.623 1.441.101.217.09.38.096.515a.57.57 0 0 1-.172.455Zm-9.213 1.62a1.606 1.606 0 0 1-.19.096c-.954.414-2.126.61-4.728-.571-2.023-.918-3.024-2.157-3.371-2.666.476.161 1.471.473 2.157.524.282.021.703.068 1.167.125.021.209.109.486.345.829l.001.001c.451.651 1.134 1.119 1.765 1.262.622.141 2.083.182 2.942-.407a3.12 3.12 0 0 0 .132-.093l.001.179a6.052 6.052 0 0 0-.221.721Zm5.512-1.271a17.49 17.49 0 0 1-1.326-.589c.437.042 1.054.083 1.692.108-.121.162-.244.323-.366.481Zm.932-1.26c-.12.17-.245.343-.373.517-.241.018-.478.03-.709.038a29.05 29.05 0 0 1-.741-.048c.608-.065 1.228-.252 1.823-.507Zm.22-.315c-.809.382-1.679.648-2.507.648-.472 0-.833.018-1.139.039v.001c-.324-.031-.665-.039-1.019-.054a3.555 3.555 0 0 1-.152-.009c.102-.002.192-.006.249-.006.363 0 1.662.034 3.151-.589 1.508-.632 2.645-1.773 3.136-3.351.37-1.186.31-2.402.086-3.312.458-.336.86-.651 1.147-.91.501-.451.743-.733.848-.869.199.206.714.864.685 2.138-.036 1.611-.606 3.187-1.501 4.154a9.099 9.099 0 0 1-1.321 1.132 11.978 11.978 0 0 0-.644-.422l-.089-.055-.051.091c-.184.332-.5.825-.879 1.374ZM4.763 5.817c-.157 1.144.113 2.323.652 3.099.539.776 2.088 2.29 3.614 2.505.991.14 2.055.134 2.055.134s-.593-.576-1.114-1.66c-.521-1.085-.948-2.104-1.734-2.786-.785-.681-1.601-1.416-2.045-1.945-.444-.53-.59-.86-.59-.86s-.656.175-.838 1.513Zm14.301 4.549a9.162 9.162 0 0 0 1.3-1.12c.326-.352.611-.782.845-1.265 1.315.145 2.399.371 2.791.434 0 0-.679 1.971-3.945 3.022l-.016-.035c-.121-.26-.385-.594-.975-1.036Zm-11.634.859a8.537 8.537 0 0 1-.598-.224c-1.657-.693-2.91-1.944-3.449-3.678-.498-1.601-.292-3.251.091-4.269.225.544.758 1.34 1.262 2.01a3.58 3.58 0 0 0-.172.726c-.163 1.197.123 2.428.687 3.24.416.599 1.417 1.62 2.555 2.193-.128.002-.253.003-.376.002Zm-1.758-.077c-.958-.341-1.901-.787-2.697-1.368C-.07 7.559 0 6.827 0 6.827s1.558-.005 3.088.179c.03.126.065.
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.tooltips", "search.highlight", "navigation.tabs", "navigation.indexes", "navigation.prune"], "search": "../../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.fe8b6f2b.min.js"></script>
</body>
</html>