defmodule Mix.Tasks.Compile.ElixirPrecompiledDeployer do @moduledoc """ Deploy recompiled binaries with Elixir script. Runs `precompiled_deploy.exs` in the current project. ## Configuration This compiler can be configured through the return value of the `project/0` function in `mix.exs`; for example: def project() do [ # ... compilers: [:elixir_precompiled_deployer] ++ Mix.compilers, # ... ] end defp deps do [ # ... {:elixir_precompiled_deployer, "~> 0.1", runtime: false}, # ... ] end The following options are available: * `:precompiled_deploy_script` - Path to the `precompiled_deploy.exs` script. ## Compilation artifacts and working with priv directories For most if not all cases, this deployer expects to download precompiled artifacts and put them into the `priv` directory. This is to: * avoid compiling non-elixir/erlang code with an external compiler * save the time from compiling large external projects Another reason to use this project is that writing deploy code in `mix.exs` that copies precompiled binaries to the `priv` directory does not work. Copied directories and files will be removed. """ use Mix.Task @doc """ Runs `precompiled_deploy.exs` in the current project. """ def run(_args) do config = Mix.Project.config() make_priv_dir(config) precompiled_deploy_script = (config[:precompiled_deploy_script] || Path.join([File.cwd!(), "precompiled_deploy.exs"])) |> Path.expand() if File.exists?(precompiled_deploy_script) do Code.eval_file(precompiled_deploy_script) end Mix.Project.build_structure() :ok end defp make_priv_dir(config) do config |> Mix.Project.build_path() |> Path.join("priv") |> File.mkdir_p!() end end