Precompiled
Install signed, verified precompiled builds of your Hex dependencies
instead of compiling them. Builds come from the
Nerves compatibility portal,
which builds selected Hex packages for the host (pure_elixir) and for
Nerves systems, signs a batch index every 15 minutes, and serves files by
SHA-256. A dependency is installed only when a build matches the project on
every rule in What matches;
everything else compiles as before, and nothing this library does can fail
your build.
Installation
With Igniter (Elixir 1.18 or later):
mix igniter.install precompiled
Or by hand, in mix.exs:
def project do
[
...,
aliases: [
"deps.loadpaths": ["deps.compile precompiled", "precompiled.deps", "deps.loadpaths"]
]
]
end
defp deps do
[
{:precompiled, "~> 0.3", runtime: false},
...
]
end
No config is needed: builds come from the portal's signed API by default. The source, its mirrors and the root of trust can be changed only in the project's config, never by an option or an environment variable (see Trust).
Usage
Nothing more: every mix compile, mix test, mix phx.server and
mix release installs the matching builds before Mix compiles the rest,
and prints one line per candidate:
precompiled: ash 3.36.0 HIT 4.1 MB
precompiled: nerves_pack 0.7.1 MISS built with nerves_ssh 1.3.3, project has 1.3.2
precompiled: 40 hit, 5 miss, 0 fail of 45 deps, 61.2 MB, 8.3 s
In a script or a Livebook cell, with the archive installed:
Precompiled.Host.install([{:jason, "1.4.5"}, {:decimal, "3.2.0"}])
On a running Nerves device, from an IEx shell:
Precompiled.install(:recon)
PRECOMPILED=0 turns it off.
mix precompiled.report sends the last build's HIT/MISS/FAIL report,
after showing it and asking (see
Troubleshooting).
Guides
Getting started:
- Setup: any Mix project,
umbrellas, Phoenix, CI,
Mix.installand Livebook - Nerves
- On a device, including bundles for devices with no network
Reference:
- Configuration: every key and variable, turning it off, seeing what happened
- What matches
Explanation:
- Trust: the signed chain, on the host and on the device, and CA certificates
Troubleshooting:
- Troubleshooting: every line the library prints, and what to do
- Known limitations
The guides are also in guides/. To work on the library, see CONTRIBUTING.md.
Supported versions
Elixir 1.17 or later on OTP 27 or later; the Igniter installer needs Elixir 1.18. Builds serve only the toolchains the portal builds with (today Elixir 1.19.3 and 1.20.3 on OTP 28 and 29); see Supported versions.
Names
The package is precompiled; the repository keeps its old name,
elixir_precompiled. This library was called nerves_precompiled until
v0.1.0; those old config keys and environment variables still work for
one release (see Configuration).
The interim elixir_precompiled names (app, modules,
ELIXIR_PRECOMPILED_* variables, the cache dir) were never released and
are not read.
License
Apache-2.0. See LICENSE.