Precompiled

Hex version HexDocs CI Nerves

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.

Guides

Getting started:

Reference:

Explanation:

Troubleshooting:

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.