diff options
author | José Valim <jose.valim@dashbit.co> | 2022-05-11 13:19:36 +0200 |
---|---|---|
committer | José Valim <jose.valim@dashbit.co> | 2022-05-11 13:19:38 +0200 |
commit | cef851638ce2ae46fa8f3be810140b423d040c59 (patch) | |
tree | 4768677b2726d9f2f4491465061ca45a4b2b54d8 | |
parent | d994415ac84fd007797d48aaed853a96a03e2023 (diff) | |
download | elixir-cef851638ce2ae46fa8f3be810140b423d040c59.tar.gz |
Add --no-optional-deps to skip optional dependencies for compilation testing
Closes #11798.
-rw-r--r-- | lib/mix/lib/mix/tasks/compile.elixir.ex | 2 | ||||
-rw-r--r-- | lib/mix/lib/mix/tasks/compile.ex | 3 | ||||
-rw-r--r-- | lib/mix/lib/mix/tasks/deps.loadpaths.ex | 9 | ||||
-rw-r--r-- | lib/mix/lib/mix/tasks/loadpaths.ex | 1 | ||||
-rw-r--r-- | lib/mix/test/mix/tasks/compile.elixir_test.exs | 37 |
5 files changed, 51 insertions, 1 deletions
diff --git a/lib/mix/lib/mix/tasks/compile.elixir.ex b/lib/mix/lib/mix/tasks/compile.elixir.ex index 903017f00..3922dbc32 100644 --- a/lib/mix/lib/mix/tasks/compile.elixir.ex +++ b/lib/mix/lib/mix/tasks/compile.elixir.ex @@ -103,7 +103,7 @@ defmodule Mix.Tasks.Compile.Elixir do manifest = manifest() base = xref_exclude_opts(project[:elixirc_options] || [], project) - cache_key = {base, srcs} + cache_key = {base, srcs, "--no-optional-deps" in args} opts = base diff --git a/lib/mix/lib/mix/tasks/compile.ex b/lib/mix/lib/mix/tasks/compile.ex index 46c41f8e3..2cbb05241 100644 --- a/lib/mix/lib/mix/tasks/compile.ex +++ b/lib/mix/lib/mix/tasks/compile.ex @@ -54,6 +54,9 @@ defmodule Mix.Tasks.Compile do * `--no-compile` - does not actually compile, only loads code and perform checks * `--no-deps-check` - skips checking of dependencies * `--no-elixir-version-check` - does not check Elixir version + * `--no-optional-deps` - does not compile or load optional deps. Useful for testing + if a library still successfully compiles without optional dependencies (which is the + default case with dependencies) * `--no-protocol-consolidation` - skips protocol consolidation * `--no-validate-compile-env` - does not validate the application compile environment * `--return-errors` - returns error status and diagnostics instead of exiting on error diff --git a/lib/mix/lib/mix/tasks/deps.loadpaths.ex b/lib/mix/lib/mix/tasks/deps.loadpaths.ex index 9db870d3e..eb30eb9ae 100644 --- a/lib/mix/lib/mix/tasks/deps.loadpaths.ex +++ b/lib/mix/lib/mix/tasks/deps.loadpaths.ex @@ -18,12 +18,21 @@ defmodule Mix.Tasks.Deps.Loadpaths do * `--no-deps-check` - does not check or compile deps, only load available ones * `--no-elixir-version-check` - does not check Elixir version * `--no-load-deps` - does not add deps loadpaths to the code path + * `--no-optional-deps` - does not compile or load optional deps """ @impl true def run(args) do all = Mix.Dep.load_and_cache() + + all = + if "--no-optional-deps" in args do + for dep <- all, dep.opts[:optional] != true, do: dep + else + all + end + config = Mix.Project.config() unless "--no-elixir-version-check" in args do diff --git a/lib/mix/lib/mix/tasks/loadpaths.ex b/lib/mix/lib/mix/tasks/loadpaths.ex index 303f8b987..dd64d3b2a 100644 --- a/lib/mix/lib/mix/tasks/loadpaths.ex +++ b/lib/mix/lib/mix/tasks/loadpaths.ex @@ -22,6 +22,7 @@ defmodule Mix.Tasks.Loadpaths do * `--no-deps-check` - does not check dependencies, only load available ones * `--no-elixir-version-check` - does not check Elixir version * `--no-load-deps` - does not add deps loadpaths to the code path + * `--no-optional-deps` - does not compile or load optional deps """ @impl true diff --git a/lib/mix/test/mix/tasks/compile.elixir_test.exs b/lib/mix/test/mix/tasks/compile.elixir_test.exs index 9bc5b948d..a2258f11c 100644 --- a/lib/mix/test/mix/tasks/compile.elixir_test.exs +++ b/lib/mix/test/mix/tasks/compile.elixir_test.exs @@ -1494,4 +1494,41 @@ defmodule Mix.Tasks.Compile.ElixirTest do refute_received {:mix_shell, :info, ["Compiled lib/c.ex"]} end) end + + defmodule GitApp do + def project do + [ + app: :git_app, + version: "0.1.0", + deps: [ + {:git_repo, "0.1.0", git: fixture_path("git_repo"), optional: true} + ] + ] + end + end + + test "compiles without optional dependencies" do + in_fixture("no_mixfile", fn -> + Mix.Project.push(GitApp) + + File.write!("lib/a.ex", """ + defmodule A do + def hello, do: GitRepo.hello() + end + """) + + assert capture_io(:stderr, fn -> + Mix.Tasks.Compile.run(["--no-optional-deps"]) == :ok + end) =~ "GitRepo.hello/0 is undefined" + end) + end + + test "recompiles if --no-optional-deps change" do + in_fixture("no_mixfile", fn -> + Mix.Project.push(MixTest.Case.Sample) + assert Mix.Tasks.Compile.Elixir.run([]) == {:ok, []} + assert Mix.Tasks.Compile.Elixir.run([]) == {:noop, []} + assert Mix.Tasks.Compile.Elixir.run(["--no-optional-deps"]) == {:ok, []} + end) + end end |