Current section
Files
Jump to
Current section
Files
lib/mix/task.nox.ex
defmodule Mix.Tasks.Nox.Install do
@moduledoc "Install nvm, node and npm in priv dir"
@nvm_git_url "https://github.com/nodenv/nodenv"
@node_build_url "https://github.com/nodenv/node-build.git"
require Logger
alias Nox.Semver
def run(args) do
stale? = Semver.cmp(Mix.Project.config()[:versions][:nvm], Nox.Nvm.version(), :minor) > 0
do_install_nvm(stale?, args)
src = Path.join [Nox.Nvm.basedir(), "src", "realpath.c"]
target = Path.join [Nox.Nvm.basedir(), "libexec", "nodenv-realpath.dylib"]
do_compile_nvm(Mix.Utils.stale?([src], [target]))
destdir = Path.join([Nox.Nvm.basedir(), "plugins", "node-build"])
do_install_node_build(not File.exists?(destdir))
stale? = Semver.cmp(Mix.Project.config()[:versions][:node], Nox.Node.version(), :minor) > 0
do_install_node(stale?, args)
_ = Nox.Nvm.run("global #{Mix.Project.config()[:versions][:node]}")
end
defp do_install_nvm(false, _args), do: Logger.info("SKIP nodenv.install (up-to-date)")
defp do_install_nvm(true, args) do
Mix.Tasks.Nox.Clean.run(args)
nvm_vsn = Mix.Project.config()[:versions][:nvm]
Logger.info("INSTALL nodenv #{nvm_vsn}")
:ok = File.mkdir_p! Nox.Nvm.basedir()
opts = [cd: Nox.Nvm.basedir(), stderr_to_stdout: true]
{_, 0} = System.cmd("git", ["init"], opts)
{_, 0} = System.cmd("git", ["remote", "add", "-f", "origin", @nvm_git_url], opts)
{_, 0} = System.cmd("git", ["checkout", nvm_vsn], opts)
end
defp do_compile_nvm(false), do: Logger.info("SKIP nodenv.compile (up-to-date)")
defp do_compile_nvm(true) do
Logger.info("COMPILE nodenv")
configure = Path.join [Nox.Nvm.basedir(), "src", "configure"]
srcdir = Path.join [Nox.Nvm.basedir(), "src"]
{_, 0} = System.cmd(configure, [], cd: Nox.Nvm.basedir(), stderr_to_stdout: true, into: Nox.Cli.stream())
{_, 0} = System.cmd("make", ["-C", srcdir], cd: Nox.Nvm.basedir(), stderr_to_stdout: true, into: Nox.Cli.stream())
end
defp do_install_node_build(false), do: Logger.info("SKIP node-build.install (up-to-date)")
defp do_install_node_build(true) do
Logger.info("INSTALL node-build")
destdir = Path.join [Nox.Nvm.basedir(), "plugins", "node-build"]
{_, 0} = System.cmd("git", ["clone", @node_build_url, destdir], stderr_to_stdout: true)
end
defp do_install_node(false, _), do: Logger.info("SKIP node.install (up-to-date)")
defp do_install_node(true, _args) do
node_vsn = Mix.Project.config()[:versions][:node]
Logger.info("INSTALL node #{node_vsn}")
_ = Nox.Nvm.run("install #{node_vsn}")
end
end
defmodule Mix.Tasks.Nox.Clean do
@moduledoc "Cleanup nvm install"
require Logger
def run(_args) do
Logger.info("CLEAN nvm")
_ = File.rm_rf!(Nox.Nvm.basedir())
end
end